Weblogic : Sauvez Wallet !

Lors du démarrage de votre serveur weblogic, vous rencontrez une erreur qui bloque son lancement qui semble vous parler de son portefeuille : Impossible d’ouvrir le portefeuille (wallet). Devant ce problème, vous vous interrogez et commencez à rechercher sur le net comment vous allez pouvoir sauver Wallet…

Le symptôme

Lorsque vous démarrez votre serveur,  après un temps d’attente, vous vous rendez compte qu’il ne semble pas se lancer. Une fois votre patience à bout, vous retroussez vos manches et décidez de vous lancer pour comprendre pourquoi votre serveur préféré ne semble pas vouloir démarrer.
Une fois dans les logs, vous découvrez une trace qui au premier abord peut ne pas être parlante quand on ne sait pas de quoi il retourne :
(version anglaise : oracle.security.jps.service.credstore.CredStoreException: JPS-01050: Opening of wallet based credential store failed. Reason java.io.IOException: PKI-02002: Unable to open the wallet. Check password.)

ATTENTION: Echec de l'ouverture de la banque d'informations d'identification et de connexion bas<E9>e sur le portefeuille (wallet). Raison : java.io.IOException: PKI-02002 : Impossible d'ouvrir le portefeuille (wallet). V<E9>rifiez le mot de passe.
oracle.security.jps.service.credstore.CredStoreException: JPS-01050: Echec de l'ouverture de la banque d'informations d'identification et de connexion bas<E9>e sur le portefeuille (wallet). Raison : java.io.IOException: PKI-02002 : Impossible d'ouvrir le portefeuille (wallet). V<E9>rifiez le mot de passe.
        at oracle.security.jps.internal.credstore.ssp.CsfWalletManager.openWallet(CsfWalletManager.java:177)
        at oracle.security.jps.internal.credstore.ssp.SspCredentialStore.doInit(SspCredentialStore.java:217)
        at oracle.security.jps.internal.credstore.ssp.SspCredentialStore.<init>(SspCredentialStore.java:139)
        at oracle.security.jps.internal.credstore.ssp.SspCredentialStore.<init>(SspCredentialStore.java:126)
        at oracle.security.jps.internal.credstore.ssp.SspCredentialStoreProvider.getInstance(SspCredentialStoreProvider.java:114)
        at oracle.security.jps.internal.credstore.ssp.SspCredentialStoreProvider.getInstance(SspCredentialStoreProvider.java:52)
        at oracle.security.jps.internal.core.runtime.ContextFactoryImpl.findServiceInstance(ContextFactoryImpl.java:139)
        at oracle.security.jps.internal.core.runtime.ContextFactoryImpl.getContext(ContextFactoryImpl.java:170)
        at oracle.security.jps.internal.core.runtime.ContextFactoryImpl.getContext(ContextFactoryImpl.java:191)
        at oracle.security.jps.internal.core.runtime.JpsContextFactoryImpl.getContext(JpsContextFactoryImpl.java:132)
        at oracle.security.jps.internal.core.runtime.JpsContextFactoryImpl.getContext(JpsContextFactoryImpl.java:127)
        at oracle.security.jps.internal.policystore.PolicyUtil$1.run(PolicyUtil.java:798)
        at oracle.security.jps.internal.policystore.PolicyUtil$1.run(PolicyUtil.java:792)
        at java.security.AccessController.doPrivileged(Native Method)
       [... stacktrace ...]
Caused By: oracle.security.jps.service.credstore.CredStoreException: JPS-01050: Echec de l'ouverture de la banque d'informations d'identification et de connexion bas<E9>e sur le portefeuille (wallet). Raison : java.io.IOException: PKI-02002 : Impossible d'ouvrir le portefeuille (wallet). V<E9>rifiez le mot de passe.
        at oracle.security.jps.internal.credstore.ssp.CsfWalletManager.openWallet(CsfWalletManager.java:177)
        at oracle.security.jps.internal.credstore.ssp.SspCredentialStore.doInit(SspCredentialStore.java:217)
        at oracle.security.jps.internal.credstore.ssp.SspCredentialStore.<init>(SspCredentialStore.java:139)
        at oracle.security.jps.internal.credstore.ssp.SspCredentialStore.<init>(SspCredentialStore.java:126)
        at oracle.security.jps.internal.credstore.ssp.SspCredentialStoreProvider.getInstance(SspCredentialStoreProvider.java:114)
        Truncated. see log file for complete stacktrace
<Notice> <WebLogicServer> <BEA-000365> <Server state changed to FAILED>
<Error> <WebLogicServer> <BEA-000383> <A critical service failed. The server will shut itself down>
<Notice> <WebLogicServer> <BEA-000365> <Server state changed to FORCE_SHUTTING_DOWN>

Après une lecture un peu plus poussée, il semblerait qu’un élément du serveur nécessaire pour la gestion d’authentification ne pourrait être ouvert. Si comme moi ce problème vous arrive alors que vous n’avez effectué aucune opération concernant ce type d’élément, vous ne comprenez pas forcément à ce moment ce qu’il se passe, et vous interrogez : « Pourquoi ?! ».

Comprendre la cause du mal

Après quelques recherches sur Internet, vous trouverez des explications : le problème semble provenir d’un fichier cwallet.sso.
Ce fichier est en fait un portefeuille permettant le stockage d’informations d’authentification, utilisé par le serveur Weblogic. Il est nécessaire au démarrage du serveur et ne semble plus pouvoir être consulté. A priori il existe en divers emplacements, et notamment dans la configuration du domaine :

$DOMAIN_HOME/config/fmwconfig/cwallet.sso

Tout semble donc pointer sur le fait que Wallet ait un problème… mais comment le sauver ?

Combattre le mal

Ce problème semble avoir plusieurs causes initiales, qui peut être explique les différents modes de résolutions proposés. Dans le cas rencontré, c’est la 2ème solution qui s’est révélé être la bonne. L’autre est précisée malgré tout car elle semble avoir aidée d’autres personnes pour le même type de problème (pourquoi pas vous finalement) :

Méthode – Chmod/chown

Une des solutions trouvé consistait à effectuer :

  • un chmod 777 du /tmp

ou

  • un chown de l’utilisateur lançant le serveur sur les fichiers tmp et du serveur.

Dans le cadre où le problème a été rencontré, cela n’a pas été efficace. Cette solution est souvent préconisée (déjà utilisée) notamment quand un serveur refusait de démarrer suite à un démarrage avec un mauvais utilisateur (genre root) qui au final avait généré des fichiers non utilisables lorsque vous relanciez le serveur avec le bon utilisateur.

Méthode – Fichier corrompu

Certains font état d’une corruption du fichier cwallet.sso, qui du coup est d’une taille ridicule (0 octets dans notre cas).
Ce fichier est automatiquement généré au démarrage du serveur s’il n’existe pas. Le renommer en « .old » a donc suffit à permettre le redémarrage du serveur.
Après investigations, ce problème était la cause visible d’un autre problème : un espace disque saturé. La corruption du fichier serait survenue suite à cette saturation d’espace.

Les séquelles

Malheureusement si comme moi c’est la première fois que vous rencontrez ce problème, le fait d’avoir « réinitialisé » ce portefeuille peut avoir des conséquences, notamment pour tout ce qui touche à des mécanismes d’authentification.
Je ne suis pas capable à ce stade de lister tous les problèmes possibles, mais il est fortement conseillé de tester l’ensemble de vos composites pour vous assurer que tout fonctionne bien correctement.

Conclusion

Si comme moi vous avez eu une petite goutte de sueur perlant le long du front devant cette erreur… qui semblait ne rien avoir à faire avec les manipulations faites sur le serveur… et que vous souhaitez garder l’esprit tranquille : sauvegardez le cwallet.sso et penchez vous sur la gestion de l’espace.
La prochaine fois vous n’aurez qu’à reprendre la sauvegarde (et ainsi limiter les séquelles).
Sources