Jak*_*atý 63 java ssl https certificate ca
我正在尝试连接到安全的Web服务.
即使我的密钥库和信任库已正确设置,我也会收到握手失败.
经过几天的挫折,无休止的谷歌搜索并询问周围的每个人我发现唯一的问题是java选择不在握手期间将客户端证书发送到服务器.
特别:
我的问题:
我确实为此设置了一个肮脏的解决方法,但我对此并不高兴所以如果有人能为我澄清这个,我会很高兴.
Bru*_*uno 93
您可能已将中间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
Run Code Online (Sandbox Code Playgroud)
别名是myalias.如果您使用-v此外,您应该看到Alias Name: myalias.
如果您尚未单独使用它,请从密钥库导出客户端证书:
keytool -exportcert -rfc -file clientcert.pem -keystore store.jks -alias myalias
Run Code Online (Sandbox Code Playgroud)
这应该给你一个PEM文件.
使用文本编辑器(或cat),bundle.pem使用该客户端证书和中间CA证书(如果需要,可能还有根CA证书本身)准备文件(让我们称之为),以便客户端证书位于开头及其颁发者证书就在.
这应该是这样的:
-----BEGIN CERTIFICATE-----
MIICajCCAdOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJVSzEa
....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICkjCCAfugAwIBAgIJAKm5bDEMxZd7MA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV
....
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
现在,将此捆绑包重新导入到私钥所在的别名中:
keytool -importcert -keystore store.jks -alias myalias -file bundle.pem
Run Code Online (Sandbox Code Playgroud)
小智 5
作为此处的添加,您可以使用%> openssl s_client -connect host.example.com:443并查看转储并检查所有主证书是否对客户端有效.您正在输出的底部寻找此信息. 验证返回码:0(ok)
如果添加-showcerts,它将转储与主机证书一起发送的钥匙串的所有信息,这是您加载到钥匙串中的信息.