2

我的本地开发机器上有一个有效的密钥库,其中包含用于通过 HTTPS 访问 Web 服务的证书。

我通过以下方式在我的项目中访问此密钥库:

System.setProperty("javax.net.ssl.truststore", "C:\\<workspaceprojectPath>\\SIPkeystore\\truststore.jks"); // sollte wohl auch ohne Keystore klappen
System.setProperty("javax.net.ssl.keyStore", "C:\\<workspaceprojectPath>\\SIPkeystore\\SIPkeystore.jks");  
System.setProperty("javax.net.ssl.keyStorePassword", "SECRET");

现在我想从另一个项目访问该证书。在那里,我提供了另一个(本地)项目目录中密钥库的相同(完整)路径。

显然,jvm 仍然可以找到路径并且正在设置属性,但是在访问 Web 服务时,我收到了相同的错误消息,就好像我根本没有添加密钥库一样。

尝试运行应用程序时,我得到一个

sun.security.validator.ValidatorException: PKIX path building failed:   
     sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid 
     certification path to requested target

是否有可能复制现有的密钥库?当我们将应用程序部署到我们的服务器时,这也很重要。该应用程序将作为独立 jar 运行。(没有网络服务器)

编辑: 好的,复制密钥库似乎不是问题,因为我可以在使用原始密钥库文件的本地副本时运行原始应用程序。好像是配置问题。

4

3 回答 3

4

是否有可能复制现有的密钥库?

是的。从文件系统的角度来看,它只是一个文件。

我想问题是以下之一:

  • 相关属性未在其他项目中正确设置。
  • 另一个 JVM 找不到密钥库文件(例如,由于 chrooting 或其他原因)
  • 另一个 JVM 没有访问/读取密钥库文件所需的权限。
  • 读取访问被(例如)SELinux 阻止。
于 2012-11-07T10:44:50.303 回答
2

首先,如果 Web 服务不需要客户端证书(即您介绍自己),则不需要密钥库——您只需要信任库。

可能是其他项目无法访问信任库,所以为了练习,尝试在C:\<workspaceprojectPath>\SIPkeystore\truststore.jks那里打开并读取前几个字节。如果成功,则意味着另一个项目将其他一些信任库设置为默认值,因此在这种情况下尝试:

System.out.println(System.getProperty("javax.net.ssl.trustStore"));

另外,请记住 Java 区分大小写,并且您指定javax.net.ssl.truststore了 property 而不是javax.net.ssl.trustStore. 尝试解决这个问题。

于 2012-11-19T12:18:42.510 回答
0

valicert class 3 CA 证书不在您的默认信任库中(可能是您的 JRE lib/security 目录中的 cacerts 文件,但请参阅JSSE 文档以获取完整的故事)。

我认为您应该创建自己的信任库文件(可以是 cacerts 文件的副本)并将 valicert root ca 添加到此文件中。然后使用 javax.net.ssl.trustStore 系统属性指向此文件。

于 2012-11-20T10:02:58.930 回答