5

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 似乎没有拾取它们,因为过期的证书仍然可以在它默认的任何受信任的密钥库中找到。

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

4

3 回答 3

8

通过跟踪加载证书的 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 现在应该选择您更新的密钥库,而不是其默认的硬编码版本。

于 2013-08-20T19:38:24.257 回答
1

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

  1. 在您的应用程序日志中查找准确的到期日期(在我的情况下是 2013 年 8 月 15 日)

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

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

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

列出来自 cacerts.jks 的所有证书,来自 java 的 keytool 可以做到这一点。我复制了 keytool 文件夹中的 cacerts.jks 文件,但如果 keytool 运行良好,则为可选: C:\glassfish3\jdk7\bin>keytool -list -v -keystore cacerts.jks -storepass changeit > listaCertificados.txt

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

我删除了已在 2013 年 8 月过期的 gtecybertrust5ca(在您的案例中使用过期证书的名称)。命令是:keytool -delete -alias gtecybertrust5ca -keystore cacerts.jks -storepass changeit

  1. 最后:使用更改的配置文件夹更新 glassfish-*.jar(7-zip 对我没有帮助)

jar uf glassfish-* 配置

于 2013-10-25T13:37:31.883 回答
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
于 2019-01-09T01:44:56.760 回答