我正在尝试连接到安全的Web服务。
即使我的密钥库和信任库已正确设置,我也遇到了握手故障。
经过几天的挫败,无休止的谷歌搜索并询问周围的所有人,我发现唯一的问题是java选择在握手期间不将客户端证书发送到服务器。
特别:
我的问题:
你可能已将中间CA证书导入了密钥库,而没有将其与拥有客户端证书及其私钥的条目相关联。你应该可以使用查看此内容keytool -v -list -keystore store.jks。如果每个别名条目仅获得一个证书,那么它们就不会在一起。
keytool -v -list -keystore store.jks
你需要将证书及其证书链一起导入具有私钥的密钥库别名中。
要找出哪个密钥库别名具有私钥,请使用keytool -list -keystore store.jks(我在这里假设JKS存储类型)。这将告诉你以下信息:
keytool -list -keystore store.jks
Your keystore contains 1 entry myalias, Feb 15, 2012, PrivateKeyEntry, Certificate fingerprint (MD5): xxxxxxxx
在这里,别名为myalias。如果还使用-v,则应该看到Alias Name: myalias。
myalias
-v
Alias Name: myalias
如果尚未单独购买,请从密钥库导出客户端证书:
keytool -exportcert -rfc -file clientcert.pem -keystore store.jks -alias myalias
这应该给你一个PEM文件。
使用文本编辑器(或cat),准备bundle.pem包含该客户端证书和中间CA证书(如果需要,还可以包括根CA证书本身)的文件(叫它),以使客户端证书位于开始位置并为其发行者证书就在下面。
cat
bundle.pem
看起来应该像这样:
-----BEGIN CERTIFICATE----- MIICajCCAdOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJVSzEa .... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICkjCCAfugAwIBAgIJAKm5bDEMxZd7MA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV .... -----END CERTIFICATE-----
现在,将此捆绑包重新导入到你的私钥为的别名中:
keytool -importcert -keystore store.jks -alias myalias -file bundle.pem