为什么在SSL握手期间java不发送客户端证书?
我试图连接到一个安全的web服务。
即使我的密钥库和信任库已正确设置,我仍遇到握手失败。
经过几天的无奈之后,无尽的搜索结果并询问身边的人,我发现唯一的问题是java在握手期间选择不发送客户端证书到服务器。
特别:
我的问题:
我确实设法为此制定了一个肮脏的解决方法,但我对此并不满意,所以如果有人能为我澄清这个问题,我会很高兴。
您可能已将中间CA证书导入密钥库,但未将其与您拥有客户端证书及其私钥的条目相关联。 您应该能够使用keytool -v -list -keystore store.jks
查看此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
作为补充,您可以使用%> openssl s_client -connect host.example.com:443并查看转储并检查所有主要证书是否对客户端有效。 您正在输出的底部寻找这个。 验证返回码:0(ok)
如果添加-showcerts,它将转储与主机证书一起发送的钥匙串的所有信息,这是您加载到钥匙串中的信息。
链接地址: http://www.djcxy.com/p/21835.html上一篇: why doesn't java send the client certificate during SSL handshake?