Arquillian 嵌入式 Glassfish 证书已过期

2023-12-06

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

这个问题与这个问题类似:启动 Glassfish 3.1.2 时日志中的证书已过期”除了,我正在使用Embedded通过 Maven、Arquillian 和 SureFire 运行单元和集成测试的 Glassfish 版本。

我尝试指示 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>

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

@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

命令行参数似乎确实符合 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 拾取,因为过期的证书 仍然可以在它默认的任何受信任的密钥库中找到。

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


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

要消除错误消息,请抓住cacerts.jks文件从其临时位置(运行 Maven 并看到过期的异常后)我在以下位置找到了它:C:\Users\{myUserName}\AppData\Local\Temp\gfembed872323756359721458tmp\config\cacerts.jks.

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

在复制密钥库的目录中的命令提示符中,使用JDK keytool删除过期的密钥如下:

keytool -delete -keystore cacerts.jks -alias gtecybertrust5ca

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arquillian 嵌入式 Glassfish 证书已过期 的相关文章

随机推荐