【问题标题】:How to connect to SSL Certificate Webservice without installing to keystore?如何在不安装到密钥库的情况下连接到 SSL 证书 Web 服务?
【发布时间】:2016-03-09 09:45:24
【问题描述】:

我正在尝试连接到需要 PKCS12 证书的 SSL 网络服务。

问题:是否可以不将证书安装到本地密钥库,而是在运行时动态加载?

我尝试如下:

static {
        KeyStore.getInstance("PKCS12").load(this.getClass().getClassLoader()
           .getResourceAsStream("myfile.p12"), "password".toCharArray());
}

但是结果:

sun.security.validator.ValidatorException:PKIX 路径构建失败。 sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径。

所以显然它不起作用。但是为什么呢?

旁注:链接的 SO 问题没有回答我的问题,因为它针对 trustStore,但我的问题是关于 keystore

【问题讨论】:

  • 它需要在 CERTSTORE 中,因为这是 java 用来验证证书的(密钥库是不同的)。您可能能够以不同的方式执行此操作,但您必须编写大量复杂的代码 - 检查其他问题以了解如何动态地将证书添加到 certstore:Adding certificate to keystore using java code
  • @Augusto 但没有TrustManagerFactory.getInstance("PKCS12");

标签: java web-services ssl


【解决方案1】:

问题与这段代码无关。您的 truststore 不信任 服务器的 证书。如果它是自签名的,则必须导入它。更好的是,由 CA 签署。

【讨论】:

  • 我刚收到来自网络服务所有者的 4 个文件:crt, csr, key, p12。现在我只是试图通过https 连接到该网络服务。也许我做错了?
  • @membersound 有点奇怪...他们给了你他们的私钥吗?或者这是要做的事情mutual authentication? (这仍然很奇怪,因为那时 他们 可能有你的私钥的副本)。肯定有一个缺失的拼图......没有它,我不确定其他人能否提供帮助。
  • 其实你是对的:服务器提供了一个自签名证书。我将 TrustStoreManager 配置为始终信任服务器证书,从而解决了错误。作为keystore 文件,我从crt + key 创建了我自己的pfx。我假设我本可以使用提供的p12 if 他们给了我通行证 - 他们没有。另外我假设我不应该收到csr 作为客户端的密钥。
【解决方案2】:

问题在于,虽然您的密钥库已经创建并加载了您的客户端证书(假设一切正常),但 SSLContext 并未配置为使用它。

试试:

Keystore keystore = KeyStore.getInstance("PKCS12").load(this.getClass().getClassLoader()
       .getResourceAsStream("myfile.p12"), "password".toCharArray());
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore,"password".toCharArray()).build();
SSLContext.setDefault(sslcontext);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多