java为什么在SSL握手期间不发送客户端证书?

问题描述 投票:65回答:3

我正在尝试连接到安全的Web服务。

即使我的密钥库和信任库已正确设置,我也遇到握手失败。

经过几天的挫折,无休止的谷歌搜索,并问了周围的所有人,我发现唯一的问题是java选择在握手期间不将客户端证书发送到服务器。

特定:

  1. 服务器请求了客户端证书(CN = RootCA)-即“给我一个由根CA签名的证书”]
  2. Java查看了密钥库,只找到了我的客户端证书,该证书由“ SubCA”签名,该证书又由“ RootCA”颁发。进入信任库并没有打扰...嗯,我想
  3. 不幸的是,当我尝试将“ SubCA”证书添加到密钥库时,这根本没有帮助。我确实检查了证书是否已加载到密钥库中。它们可以,但是KeyManager会忽略除客户端证书以外的所有证书。
  4. 以上所有情况导致java决定它没有任何可满足服务器请求的证书,并且不发送任何信息... tadaaa握手失败:-(

我的问题:

  1. 是否有可能以“破坏证书链”之类的方式将“ SubCA”证书添加到密钥库中,以便KeyManager仅加载客户端证书而忽略其余证书? (Chrome和openssl设法弄清楚了为什么Java不能这么做?-请注意,“ SubCA”证书始终作为受信任的机构单独显示,因此Chrome显然在握手期间将其与客户端证书一起正确打包了)
  2. 这是服务器端的正式“配置问题”吗?该服务器是第三方。我希望服务器请求由“ SubCA”授权机构签名的证书,因为那是他们提供给我们的。我怀疑这在Chrome和openssl中有效的事实是因为它们的“限制性较小”,而Java只是“靠书”而失败。

我确实设法解决了这个问题,但是对此我不是很高兴,所以如果有人可以为我澄清这个问题,我将非常高兴。

java ssl https certificate ca
3个回答
96
投票

您可能已将中间CA证书导入了密钥库,而没有将其与拥有客户端证书及其私钥的条目相关联。您应该可以使用keytool -v -list -keystore store.jks看到它。如果每个别名条目仅获得一个证书,那么它们就不会在一起。

您需要将证书及其证书链一起导入具有私钥的密钥库别名。

要找出哪个密钥库别名具有私钥,请使用keytool -list -keystore store.jks(我在这里假设JKS存储类型)。这会告诉你这样的内容:

Your keystore contains 1 entry

myalias, Feb 15, 2012, PrivateKeyEntry, 
Certificate fingerprint (MD5): xxxxxxxx

这里,别名为myalias。如果除此之外还使用-v,则应该看到Alias Name: myalias

如果尚未单独购买,请从密钥库中导出客户端证书:

keytool -exportcert -rfc -file clientcert.pem -keystore store.jks -alias myalias

这应该给您一个PEM文件。

使用文本编辑器(或cat),准备包含该客户端证书和中间CA证书(如果需要,还可以包括根CA证书本身)的文件(我们将其称为bundle.pem),以便客户端-证书位于开头,而其颁发者证书位于下方。

这应该看起来像:

-----BEGIN CERTIFICATE-----
MIICajCCAdOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJVSzEa
....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICkjCCAfugAwIBAgIJAKm5bDEMxZd7MA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV
....
-----END CERTIFICATE-----

现在,将此捆绑软件重新导入到您的私钥为:的别名中:

keytool -importcert -keystore store.jks -alias myalias -file bundle.pem

6
投票

作为此处的补充,您可以使用%> openssl s_client -connect host.example.com:443并查看转储,并检查所有主要证书对客户端是否有效。您正在输出的底部寻找它。验证返回码:0(确定)

如果添加-showcerts,它将转储与主机证书一起发送的钥匙串的所有信息,这就是您加载到钥匙串中的信息。


-1
投票

事情是,当使用由中间人签名的客户端证书时,您需要在托管人中包括中间人,以便Java可以找到它。可以单独发行,也可以与发行根的捆绑发行。

© www.soinside.com 2019 - 2024. All rights reserved.