8 月 14 日,Glassfish 使用的 gtecybertrust5ca 证书过期,导致我的 Arquillian 测试打印错误。
此问题与此问题类似:通过启动 Glassfish 3.1.2 在日志中显示“证书已过期”,除了我通过 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
命令行 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 似乎没有拾取它们,因为过期的证书仍然可以在它默认的任何受信任的密钥库中找到。
我真的很感激一些帮助。谢谢。