Hea*_*065 5 certificate glassfish maven jboss-arquillian
8月14日,Glassfish使用的gtecybertrust5ca证书到期,导致我的Arquillian测试打印错误.
这个问题类似于此:证书已在日志中通过启动Glassfish的3.1.2过期"只是,我使用的是嵌入式的Glassfish的版本通过Maven的,和的Arquillian神火运行单元和集成测试.
我已经尝试指示Maven使用本地密钥库,即JRE附带的密钥库,以保持过期的证书不被使用.我验证过期的证书不包含在此密钥库中:
C:\Java\jdk1.7.0_25\jre\lib\security>keytool -list -keystore cacerts
Run Code Online (Sandbox Code Playgroud)
我通过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>
Run Code Online (Sandbox Code Playgroud)
我还添加了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% ...
Run Code Online (Sandbox Code Playgroud)
这是用于运行单元测试的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
Run Code Online (Sandbox Code Playgroud)
命令行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";
Run Code Online (Sandbox Code Playgroud)
但是,它们似乎没有被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
Embedded Glassfish现在应该选择更新的密钥库而不是默认的硬编码版本.
| 归档时间: |
|
| 查看次数: |
6241 次 |
| 最近记录: |