Arquillian嵌入式Glassfish证书已过期

时间:2013-08-18 22:22:28

标签: maven glassfish certificate jboss-arquillian

8月14日,Glassfish使用的gtecybertrust5ca证书过期,导致我的Arquillian测试打印错误。

此问题类似于以下问题:Certificate has expired” in log by starting Glassfish 3.1.2除了,我通过Maven,Arquillian和SureFire使用Glassfish的 Embedded 版本来运行单元和集成测试。

我已经尝试过指示Maven使用本地密钥库,即JRE附带的密钥库,以保持过期的证书不被使用。我验证过期的证书不包含在此密钥库中:

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

我通过Maven指示SureFire启动带有参数的JVM以使用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>

我还添加了JVM参数,其中Maven是在Maven的mvn.bat文件中启动的:

@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% ...

这是用于运行单元测试的JVM的Surefire调用:

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

命令行args似乎与Glassfish期望的预期系统属性相匹配 根据其com.sun.enterprise.security.ssl.impl.SecuritySupportImpl和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";

然而,它们似乎没有被Glassfish接收,因为过期的证书 仍然在它默认的任何可信密钥库中找到。

我真的很感激一些帮助。感谢。

3 个答案:

答案 0 :(得分:8)

我终于通过跟踪加载证书的Glassfish代码来解决问题的根源。嵌入式的至少版本忽略任何传入的参数,并查看其类路径以查找要加载的可信密钥库。然后它将其写入临时位置并指示服务器加载并使用它。

要摆脱错误消息,从其临时位置抓取cacerts.jks(在运行Maven并看到过期的异常后),我发现它在:C:\ Users {myUserName} \ AppData \ Local \ Temp \ gfembed872323756359721458tmp \配置\ cacerts.jks

将此文件复制到resources / config / cacerts.jks下的项目中(需要将其加载到测试类路径中)

从您复制密钥库的目录中的命令提示符处,使用您的jdk keytool删除过期密钥,如下所示:

keytool -delete -keystore cacerts.jks -alias gtecybertrust5ca

Embedded Glassfish现在应该选择更新的密钥库而不是默认的硬编码版本。

答案 1 :(得分:1)

我按照以下步骤解决了问题:

  1. 在您的申请日志中找到确切的到期日期(在我的情况下是2013年8月15日)

  2. 将glassfish- .jar中的文件提取到文件夹glassfish中 -

  3. 在glassfish- *找到一个文件夹配置。它包含所需的cacerts.jks

  4. 使用java keytool我使用我找到的答案列出所有证书here

  5.   

    列出来自cacerts.jks的所有证书,来自java的keytool可以做   那。我复制了keytool文件夹中的cacerts.jks文件,但是   如果keytool工作正常,则为可选:   C:\ glassfish3 \ jdk7 \ bin&gt; keytool -list -v -keystore cacerts.jks -storepass changeit&gt; listaCertificados.txt

    1. 打开listaCertificados.txt并按应用日志中第一步找到的日期查找证书名称
    2. 再次
    3.   

      我删除了gtecybertrust5ca(使用在你的情况下过期的证书的名称),认证在2013年8月到期。   命令是:   keytool -delete -alias gtecybertrust5ca -keystore cacerts.jks -storepass changeit

      1. 最后一个:更新glassfish - * .jar,更改了配置文件夹(7-zip对我没有帮助)
      2.   

        jar uf glassfish- * config

答案 2 :(得分:0)

您现在可以将证书作为OpenJDK软件包的一部分获得-请参见https://dzone.com/articles/openjdk-10-now-includes-root-ca-certificates

对于Docker安装,您可以执行以下操作:

# 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