Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven Arquillian嵌入式Glassfish证书已过期_Maven_Glassfish_Certificate_Jboss Arquillian - Fatal编程技术网

Maven Arquillian嵌入式Glassfish证书已过期

Maven Arquillian嵌入式Glassfish证书已过期,maven,glassfish,certificate,jboss-arquillian,Maven,Glassfish,Certificate,Jboss Arquillian,8月14日,Glassfish使用的gtecybertrust5ca证书过期,导致我的Arquillian测试打印错误 这个问题与此类似:除了,我通过Maven、Arquillian和SureFire使用Glassfish的嵌入式版本来运行单元测试和集成测试 我曾尝试指示Maven使用本地密钥库,即JRE附带的密钥库,以避免使用过期的证书。我已验证此密钥库中不包含过期证书: C:\Java\jdk1.7.0_25\jre\lib\security>keytool -list -keysto

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

这个问题与此类似:除了,我通过Maven、Arquillian和SureFire使用Glassfish的嵌入式版本来运行单元测试和集成测试

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

C:\Java\jdk1.7.0_25\jre\lib\security>keytool -list -keystore 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指示SureFire使用参数启动JVM,以使用cacerts可信密钥库:

C:\Java\jdk1.7.0_25\jre\lib\security>keytool -list -keystore 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的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代码,我终于找到了问题的症结所在。嵌入式版本至少会忽略任何传入的参数,并查看其类路径以查找要加载的可信密钥存储。然后将其写入临时位置,并指示服务器加载和使用它

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

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

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

keytool-delete-keystore cacerts.jks-alias gtecybertrust5ca


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

我通过以下步骤解决了这个问题:

  • 在您的应用程序日志中查找准确的过期日期(在我的案例中,是2013年8月15日)

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

  • 在glassfish-*中查找文件夹配置。它包含所需的cacerts.jks

  • 使用JavaKeyTool,我使用找到的答案列出所有证书

  • 列出cacerts.jks中的所有证书,java的keytool可以做到这一点 那个我复制了keytool文件夹中的cacerts.jks文件,但是 如果keytool工作正常,则为可选: C:\glassfish3\jdk7\bin>keytool-list-v-keystore cacerts.jks-storepass changeit>listaCertificados.txt

  • 打开listaCertificados.txt,按您在应用程序日志的第一步中找到的日期查找证书名称
  • 再次
  • 我删除了2013年8月过期的gtecybertrust5ca(在我们的案例中使用过期证书的名称)。 命令是: keytool-delete-alias gtecybertrust5ca-keystore cacerts.jks-storepass changeit

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


    现在,您可以将证书作为OpenJDK包的一部分获得-请参阅

    对于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
    

    您是否为glassfish maven插件设置了Djavax.net.ssl.trustStore jvm选项?是的。我在两处添加了它。第一个是启动Maven jvm的mvn.bat,第二个是在pom.xml中进行单元测试的分支:-Djavax.net.ssl.trustStore=C:\Java\jdk1.7.0\u 25\jre\lib\security\cacerts.jks-Djavax.net.ssl.trustStorePassword=changeita是否使用netbeans?您可以从外部maven编辑mvn.bat,但您仍然在使用netbeans内部maven。我正在使用命令行。Glassfish似乎没有接受trustStore设置。我将在调试中编辑这个问题,显示Surefire在Maven测试中调用jvm。@Heather92115是否可以包括测试https URL的Arquillian测试类?从独立GF中删除过时的证书时,密码是更改的。一旦我将cacerts、jks放到
    test/resources/config
    中,我就会变得
    严重:启动服务无法启动:com.sun.enterprise.security.admin.cli.SecureAdminStartupCheck
    ,域拒绝启动。有什么解决办法吗?我使用的是嵌入式GF 3.1.2.2。您必须将cacerts.jks文件放在您的src目录(src/main/resources/config)中,而不是测试。构建最终war或ear文件时,请确保排除此文件。