我们有小型 java 客户端,它使用快速修复库连接 bloomberg 提要。这基本上是使用修复协议(protocol)。应用程序运行良好,但最近 ssl 证书已过期,bloomberg 发送了新的 key.pem、certificate.pem 文件和 CACert.pem 文件。应用程序正在使用 java 证书存储进行 ssl hanshaking。所以我尝试了以下步骤来删除 keystore 并使用新 key 恢复 keystore 。
- 删除 keystore 。
rm -rf /root/keystore.ImportKey
- 将 key.pem 和 cert.pem 文件转换为 der 二进制格式。
openssl pkcs8 -topk8 -nocrypt -in key.pem -inform PEM -out key.der -outform DER openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER
- 将 key 和证书添加到 Java keystore 。
user@host:# java ImportKey key.der cert.der Using keystore-file : /root/keystore.ImportKey One certificate, no chain. Key and certificate stored. Alias:importkey Password:importkey
- 然后我尝试将 CACert.pem 文件添加到 java keystore 。
./keytool -import -keystore /root/keystore.ImportKey -storepass importkey -alias cacertificates -file /etc/bloomburg-live/CAcert.pem
- 为了错误跟踪,我将在我的 java keytool 中添加 key 列表。
user@host:# ./keytool -list -keystore /root/keystore.ImportKey Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 2 entries cacertificates, Jun 15, 2016, trustedCertEntry, Certificate fingerprint (MD5): 30:23:CE:0A:57:FB:71:04:8F:D2:3F:CD:89:A6:46:11 importkey, Jun 15, 2016, PrivateKeyEntry, Certificate fingerprint (MD5): 00:19:35:14:3F:14:31:4D:99:83:F5:34:09:3D:C8:BD
CA 验证仍然失败。有什么我错过或。有什么不同的方法可以解决这个问题。请帮助我,我目前被困在这里。
更新 尝试以下命令后
openssl s_client -connect host:port -key key.pem -cert certificate.pem -CAfile CAcert.pem
我收到以下错误消息。
error setting private key 5265:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:x509_cmp.c:398:
执行openssl pubout命令后请查看结果。
openssl rsa -in key.pem -pubout
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6dMX7GxbEtAmdQarwHXQ d46c7oSrSjATTd1/KHvS7KojHZV9XE3d4Foh1rP1czla6uxMV5p0jSPq4RzWOZlY i8TzJMXPhz9onDPUErTmkKB1cYvzdYUjuAan4KduB/OWP+ubUS24DTZ+/RJ7SUX/ /UOcWgg232sc/sg9pcyysCRMXJUsPe5a94ztboOWr987+dnjl/t1atNRCvVObkqG Fq6pmsKKjTR0Cl1i5wFK8G8cak/cnGABhnmCBEP6v5udzgTt8QOSqg0Mb3TyhXia MnhA7SBc7cu6NEsizxLMM34G+thDxg/s0RobuBirz5KZl3GC1KgR50Ggm//5/vJv uwIDAQAB -----END PUBLIC KEY-----
在已接受的答案之后添加。 请找到我在戴夫的回答中发表的最后评论。这是解决此问题的更多内容和详细信息。
最佳答案
Meta:不是一个明确或完整的答案,但评论太多。
好的,openssl s_client
显示您的 key 和您的(声称的)证书不匹配。您需要弄清楚是否真的存在不匹配,或者您的数据只是结构异常。
查看 certificate.pem
文件,通常使用 more
或 less
这样的分页器,因为它可能很长;它应该包含至少一行(每行):
- 以
-----BEGIN CERTIFICATE-----
行开始,可能插入了X.509
; - 然后是几行(通常为 10-20,但可能更多)完全由字母、数字、加号
+
和斜线/
组成,通常还有等号=
最后;和 - 最后一行
-----END CERTIFICATE-----
可能还有X.509
。
每个 block 都是一个证书。在这些 block 之前、之间或之后可能还有其他数据可能有用(例如“友好” name' 或 'key id') 或者可能是无用的甚至是垃圾。如果有 -----BEGIN
和 base64 和 -----END
的任何 block 不是用于 [X.509] CERTIFICATE
,有些事情真的搞砸了;发布详细信息。
如果只有一个证书(并且它与 key 不匹配),则您获得的数据是错误的。回到源头,让他们修复它。 Java 标准 keytool
阻止您将不匹配的证书与私钥放在一起,但是 ImportKey
不是标准的,我不知道它的作用。
如果有多个证书,最简单的方法就是让openssl尝试去整理。做
openssl pkcs12 -export -in certificate.pem -inkey key.pem -out temp.p12
# and type (twice) a suitable password, at least 6 characters
如果显示没有证书匹配私钥
,则您的certificate.pem
文件有误或已损坏,因此无法使用。要么发布它让我们尝试弄清楚,最好使用您的私钥的公共(public)部分,即openssl rsa -in key.pem -pubout
,或者返回你的来源。
如果 pkcs12 -export
成功,那么您的 certificate.pem
确实包含必要的证书,只是不是按照 s_client
要求的常规顺序,并且您使用的过程也隐含地需要。现在你可以简单地将 p12 转换为 JKS
keytool -importkeystore -srcstore temp.p12 -srcstoretype pkcs12 -deststore good.jks
如果您需要在 keystore 中使用他们的 CACert,请对该文件执行 keytool -import -file CAcert.pem
步骤。使用结果。
关于java - 启用 CA 认证握手到 java 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37915298/