středa 5. června 2013

Glassfish 3.1.2.2 bug GRIZZLY-1375 a GRIZZLY-1385

V glassfishi novějším než verze 3.0.1 se objevuje chyba v grizzlym. Ta se projeví, při volání webové služby se zabezpečením, následujícím výpisem do serverového logu:
 WSITPVD0035: Error in Verifying Security in Inbound Message.  
 com.sun.xml.wss.impl.XWSSecurityRuntimeException: WSS1601: Security Requirements not met - Transport binding configured in policy but incoming message was not SSL enabled  
      at com.sun.xml.wss.impl.policy.verifier.MessagePolicyVerifier.verifyPolicy(MessagePolicyVerifier.java:125)  

Chyba je již od grizzlyho verze 1.9.55 vyřešena. Ovšem tato verze zatím není z update centra glassfishe dostupná.
Osvědčil se mi však následující postup s použitím toho času nejnovější verze Glassfish 3.1.2.2:
  1. Stáhnout si grizzly-utils-1.9.57.jar
  2. Stáhnout si grizzly-lzma-1.9.57.jar 
  3. Stažené soubory umístit do adresáře glassfish/modules
  4. Přihlásit se telnetem na localhost 6666. Pokud tuta volba není v GF ještě povolena, lze postupovat podle kapitoly 10.4.1 v tomto dokumentu
  5. Zadat příkaz lb grizzly. Ve výpisu budou řádky podobné těmto:
      224|Resolved   |    1|grizzly-lzma (1.9.50)
     265|Resolved   |    1|grizzly-utils (1.9.50)
  6. postupně zadat příkaz uninstall s parametrem id (první sloupec předchozího výpisu). V tomto případě
    uninstall 224
    uninstall 265
  7. Instalace novějších verzí:
    install file:../../../modules/grizzly-lzma-1.9.57.jar
    install file:../../../modules/grizzly-utils-1.9.57.jar
  8. Nyní je možné odstranit původní soubory bundlů
    rm glassfish/modules/grizzly-lzma.jar
    rm glassfish/modules/grizzly-utils.jar
Díky této opravě je možné narazit na další chybu v GF. Problémem je volání metody javax.xml.ws.WebServiceContext.getUserPrincipal(). Stejná data lze však získat i voláním javax.xml.ws.WebServiceContext.getMessageContext().get("CLIENT_SUBJECT"). Například uživatelské jméno lze získat následovně:
 javax.security.auth.Subject subject = (javax.security.auth.Subject)wsContext.getMessageContext().get("CLIENT_SUBJECT");  
       Set privateCredentials = subject.getPrivateCredentials();  
       String userName;  
       for(Object credential : privateCredentials){  
         if(credential instanceof com.sun.enterprise.security.auth.login.common.PasswordCredential) userName = ((com.sun.enterprise.security.auth.login.common.PasswordCredential)credential).getUser();  
       }  

Drobný tip k update centru nakonec: Možná se snažíte spustit update center a ten píše hlášku:
 You are running on a 64 bit Linux distribution and the 32 bit Linux  
 compatibility libraries do not appear to be installed. In order to use  
 the Update Center tools you must install the 32 bit compatibility libraries.  
 On Ubuntu (and possibly other Debian based systems) please install the  
 ia32-libs package. On RedHat 4 (and other RPM based systems), you may  
 need to add multiple 'compat' runtime library packages. Please see the  
 Update Center Release Notes for more information  
Pokud jste již ia32-libs nainstalovali a nepřišla žádná změna, pak vězte, že je třeba ještě nainstalovat libjpeg62:i386. Např. příkazem sudo apt-get install libjpeg62:i386

2 komentáře:

  1. Zdravím,

    díky za návod, pomohl mi dostat se ze svízelné situace. Pouze mě překvapilo, že po smazání bundlů (krok 8) nechce glassfish nastartovat (Unresolved constraint in bundle... [caused by: Unable to resolve 175.0: missing requirement [175.0] osgi.wiring.package; (&(osgi.wiring.package=com.sun.grizzly.lzma)(version>=1.9.55))]). Jediné, co mi pomohlo bylo nakopírovat soubory zpět do /modules/ a nechat je tam.

    Mrůzek Petr

    OdpovědětSmazat
    Odpovědi
    1. Budnly je třeba mazat při spuštěném GF. Patrně jste je mazal, když byl vypnutý.

      Smazat