java - 启用 CA 认证握手到 java 客户端

标签 java ssl

我们有小型 java 客户端,它使用快速修复库连接 bloomberg 提要。这基本上是使用修复协议(protocol)。应用程序运行良好,但最近 ssl 证书已过期,bloomberg 发送了新的 key.pem、certificate.pem 文件和 CACert.pem 文件。应用程序正在使用 java 证书存储进行 ssl hanshaking。所以我尝试了以下步骤来删除 keystore 并使用新 key 恢复 keystore 。

  1. 删除 keystore 。

rm -rf /root/keystore.ImportKey

  1. 将 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
  1. 将 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
  1. 然后我尝试将 CACert.pem 文件添加到 java keystore 。
./keytool -import -keystore /root/keystore.ImportKey  -storepass importkey -alias cacertificates -file /etc/bloomburg-live/CAcert.pem
  1. 为了错误跟踪,我将在我的 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 文件,通常使用 moreless 这样的分页器,因为它可能很长;它应该包含至少一行(每行):

  • -----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/

相关文章:

css - Chromebook 上的 Chrome 无法从 CDN 加载样式

python - SSL 不适用于 Kodi Jarvis

java - 从 Excel 文件或 CSV 文件中读取效率更高吗?

java - 使用 activeMQ + Spring : javax. jms.InvalidClientIDException:客户端:已连接的主题中的持久订阅

java - 通过 JAX-RS 中的方法覆盖类中的 @Path 注释

java - RDF 中使用的 URI 是否需要在 Jena 中取消引用?

c# - 401 未经授权的异常与 SSL 的 WebRequest

spring-mvc - Spring Boot 为私有(private)页面启用 SSL

java - 在Android中为Imageview设置唯一的标签ID

javascript - 由于 "ERR_CERT_DATE_INVALID",连接到 websocket 失败