【问题标题】:Copying java keystore复制 java 密钥库
【发布时间】:2012-10-27 07:57:55
【问题描述】:

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

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

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 运行。 (无网络服务器)

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

【问题讨论】:

  • 您确定在第二个项目中连接到同一个 Web 服务吗?
  • 您确定将签名证书添加到 trustStore 而不是 keyStore? (只是问,因为我已经这样做了,想知道为什么它不起作用!)
  • @Devon_C_Miller:我将它添加到密钥库中。我认为信任库只是为了确保密钥库是可信的。您能否进一步详细说明。谢谢
  • 密钥库保存所有私钥和相应的证书。信任库保存受信任签署证书的机构的证书。此外,如果您添加的证书没有 -trustcacerts 标志,则在尝试构建 PKIX 路径时将不会考虑它。

标签: java ssl keystore


【解决方案1】:

valicert class 3 CA 证书不在您的默认信任库中(可能是您的 JRE lib/security 目录中的 cacerts 文件,但请参阅 JSSE documentation 了解完整内容)。

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

【讨论】:

    【解决方案2】:

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

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

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

    另外,请记住 Java 区分大小写,并且您指定了 javax.net.ssl.truststore 属性而不是 javax.net.ssl.trustStore。尝试修复此问题。

    【讨论】:

    • 我创建了一个新的信任库,其中包含 CA 证书。然后我指定了 javax.net.ssl.trustStore 和 ...trustStorePassword (没有指定任何密钥库),它在我的 eclipse 中的两个项目中都像一个魅力(两个项目中相同信任库的绝对路径)谢谢你的帮助。
    【解决方案3】:

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

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

    我想问题是以下之一:

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

    【讨论】:

    • 感谢您的回答:我将上面的代码从项目1复制到项目2,所以属性应该相应设置。我要检查一下。嗯,JVM 与项目 1 相同。将属性设置为不存在的路径时,我得到一个keystore not foundexception。我从 Eclipse 运行这两个项目。他们在同一个工作区。这很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2015-12-04
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多