【问题标题】:Converted PFX SSL cert throwing SSLHandshakeException?转换后的 PFX SSL 证书抛出 SSLHandshakeException?
【发布时间】:2014-05-07 05:28:45
【问题描述】:

我获得了*.ourdomain.example.org 的 PFX“通配符”SSL 证书(我相信它是 VeriSign 证书)。然后,我使用this answer 帮助我将 PFX 转换为 JKS 密钥库条目并将其添加到 JKS 密钥库中。当我运行keytool -list -keystore mykeys.jks 时,我看到了:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

<my key's long GUUID>, May 1, 2014, PrivateKeyEntry, 
Certificate fingerprint (SHA1): <cert's fingerprint>

所以我知道转换后的 PFX 证书在那里。但在运行时,当 JNDI 使用 SSL 建立与我的 AD 服务器的连接(通过 LDAPS)时,我看到以下异常:

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

我想知道在从 PFX 到 JKS 的转换中是否出现了问题。我相当确定 SSL 证书没有其他问题,因为在使用此 PFX 之前我使用的是自签名证书,并且我的浏览器给了我典型的“我不信任此证书”警告。添加转换后的 PFX 并重新启动我的应用程序后,这些警告就消失了。关于这里可能发生什么的任何想法?

【问题讨论】:

  • 服务器是否发送了所需的威瑞信中间证书? openssl s_client -connect &lt;server&gt;:&lt;port&gt; 的输出是什么?

标签: java ssl keystore keytool pfx


【解决方案1】:

首先,在很多情况下,您不需要从 PKCS#12 (PFX) 转换为 JKS,许多应用程序会让您将密钥库类型设置为 PKCS12(而不是默认的 JKS),这将允许您直接使用您的 PFX 文件。

您似乎在这里混淆了信任存储和密钥存储的使用(请参阅this question)。

拥有带有证书的密钥库及其PrivateKeyEntry(此处来自 PKCS#12 文件)通常用作“密钥库密钥库”(与用作信任库的密钥库相反)。这通常用于您作为服务器提供给客户端的证书,或者您在连接到请求证书的服务器时使用的客户端证书。

这里,“PKIX 路径构建失败”异常意味着您的 Java 应用程序不信任它正在连接的远程证书。据推测,您的 AD 服务器与此 JKS 密钥库无关。相反,使用您的密钥库的服务器也是该 AD 服务器的客户端,它不能信任 AD 服务器证书。

你没有说你是如何配置你的应用程序的。也许您已将密钥库用于密钥库和信任库设置(有效地防止使用与默认 JRE 信任库捆绑的 CA 证书),或者您的 AD 证书可能是自签名的或不是由属于其中的一部分的 CA 颁发的默认信任库。如果是后者,只需将 AD 证书(只是证书,而不是证书及其私钥)导入到信任库中(您可以在 JRE 的 cacert 文件中执行此操作,或者复制它并使用使用javax.net.ssl.trustStore 和相关的系统属性)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 2016-12-14
    • 2015-08-28
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多