5 votes

Certificat Arquillian Embedded Glassfish expiré

Le 14 août, le certificat gtecybertrust5ca utilisé par Glassfish a expiré, provoquant des erreurs dans mes tests Arquillian.

Ce problème est similaire à celui-ci : Le certificat a expiré" dans le journal en démarrant Glassfish 3.1.2 sauf que j'utilise le Embarqué de Glassfish via Maven, Arquillian et SureFire pour exécuter des tests unitaires et d'intégration.

J'ai essayé de demander à Maven d'utiliser un keystore local, celui qui est fourni avec le JRE, afin d'empêcher l'utilisation du certificat expiré. J'ai vérifié que le certificat expiré n'est pas contenu dans ce keystore :

C:\Java\jdk1.7.0_25\jre\lib\security>keytool -list -keystore cacerts

Je demande à SureFire via Maven de démarrer la JVM avec des arguments pour utiliser le trousseau de clés de confiance cacerts :

         <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.16</version>
          <configuration>                
              <argLine>
                -Djavax.net.ssl.trustStore=C:\Java\jdk1.7.0_25\jre\lib\security\cacerts
                -Djavax.net.ssl.trustStorePassword=changeit
              </argLine>
              ....
          </configuration>
      </plugin>

      <!-- Configure the Embedded GlassFish Maven plugin -->
      <plugin>
          <groupId>org.glassfish.embedded</groupId>
          <artifactId>maven-embedded-glassfish-plugin</artifactId>
          <version>4.0</version>
          <configuration>
              <app>${project.build.directory}/${project.build.finalName}.war</app>
              <port>7070</port>
              <containerType>web</containerType>
          </configuration>
      </plugin>

J'ai également ajouté des arguments JVM lorsque Maven est lancé dans le fichier mvn.bat de Maven :

@REM Use specified java cert trust
set MAVEN_OPTS=%MAVEN_OPTS% 
 -Djavax.net.ssl.trustStore=%JAVA_HOME%\jre\lib\security\cacerts 
 -Djavax.net.ssl.trustStorePassword=changeit

%MAVEN_JAVA_EXE% %MAVEN_OPTS% ...

Voici l'invocation Surefire de la JVM utilisée pour exécuter les tests unitaires :

Forking command line: cmd.exe /X /C "C:\Java\jdk1.7.0_25\jre\bin\java 
-Djavax.net.ssl.trustStore=C:\Java\jdk1.7.0_25\jre\lib\security\cacerts 
-Djavax.net.ssl.trustStorePassword=changeit ..."
Running com.networkfleet.ssp.activation.SelectedActivationTableBeanTest

Les paramètres de la ligne de commande semblent correspondre aux propriétés du système attendues par Glassfish. dans ses classes com.sun.enterprise.security.ssl.impl.SecuritySupportImpl et com.sun.enterprise.server.pluggable.SecuritySupport :

@Contract
public abstract class SecuritySupport {

public static final String KEYSTORE_PASS_PROP = "javax.net.ssl.keyStorePassword";
public static final String TRUSTSTORE_PASS_PROP = "javax.net.ssl.trustStorePassword";
public static final String KEYSTORE_TYPE_PROP = "javax.net.ssl.keyStoreType";
public static final String TRUSTSTORE_TYPE_PROP = "javax.net.ssl.trustStoreType";
public static final String keyStoreProp = "javax.net.ssl.keyStore";
public static final String trustStoreProp = "javax.net.ssl.trustStore";

Cependant, elles ne semblent pas être prises en compte par Glassfish, car le certificat expiré ne peut pas être utilisé. expiré est toujours trouvé dans le keystore de confiance par défaut.

J'apprécierais vraiment de recevoir de l'aide. Je vous remercie.

8voto

Heather92065 Points 2662

J'ai finalement trouvé le fond du problème en traçant le code de Glassfish qui charge les certificats. La version intégrée, du moins, ignore tous les paramètres passés et recherche dans son chemin de classe la base de données de clés de confiance à charger. Elle l'écrit ensuite dans un emplacement temporaire et demande au serveur de la charger et de l'utiliser.

Pour se débarrasser des messages d'erreur, il suffit de saisir le fichier cacerts.jks de son emplacement temporaire (après avoir lancé Maven et vu l'exception expirée), je l'ai trouvé à l'endroit suivant : C:\Users\{myUserName}\AppData\Local\Temp\gfembed872323756359721458tmp\config\cacerts.jks .

Copiez ce fichier dans votre projet sous resources/config/cacerts.jks (il devra être chargé dans le chemin de classe de votre test).

À l'invite de commande, dans le répertoire où vous avez copié la base de stockage de clés, utilisez la commande JDK keytool pour supprimer la clé périmée comme suit :

keytool -delete -keystore cacerts.jks -alias gtecybertrust5ca

Embedded Glassfish devrait maintenant récupérer votre keystore mis à jour au lieu de sa version codée par défaut.

1voto

Yauhen Points 351

J'ai résolu le problème en suivant les étapes :

  1. Trouvez la date précise d'expiration dans les journaux de votre demande (dans mon cas, il s'agissait du 15 août 2013).

  2. Extraire des fichiers de glassfish- .jar dans le dossier glassfish-

  3. Dans glassfish-*, trouvez un dossier config. Il contient les cacerts.jks nécessaires

  4. En utilisant java keytool, je liste tous les certificats en utilisant la réponse que j'ai trouvée aquí

liste de tous les certificats de cacerts.jks, l'outil keytool de java peut le faire. le faire. J'ai copié le fichier cacerts.jks dans le dossier keytool mais il est [ ] C:\glassfish3\jdk7\bin >keytool -list -v -keystore cacerts.jks -storepass changeit > listaCertificados.txt

  1. Ouvrez votre listaCertificados.txt et trouvez les noms des certificats par date que vous avez trouvés à la première étape dans vos journaux d'application.
  2. de nuevo

J'ai supprimé le certificat gtecybertrust5ca (utiliser le nom des certificats qui ont expiré dans notre cas) qui a expiré en août 2013. La commande est la suivante : keytool -delete -alias gtecybertrust5ca -keystore cacerts.jks -storepass changeit

  1. la dernière : mise à jour de glassfish-*.jar avec le dossier de configuration modifié (7-zip ne m'a pas aidé)

jar uf glassfish-* config

0voto

aaronvargas Points 1881

Vous pouvez désormais obtenir les certificats dans le cadre du paquetage OpenJDK - voir https://dzone.com/articles/openjdk-10-now-includes-Root-ca-certificates

Pour une installation Docker, vous pouvez faire quelque chose comme ceci :

# Set glassfish env
ENV GLASSFISH_HOME /opt/glassfish5/glassfish

# Get latest cacerts from OpenJDK project
RUN wget https://hg.openjdk.java.net/jdk/jdk/raw-file/tip/src/java.base/share/lib/security/cacerts && \
    mv cacerts $GLASSFISH_HOME/domains/domain1/config/cacerts.jks

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X