启用CA Certification握手到Java客户端

时间:2016-06-20 05:44:36

标签: java ssl

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

  1. 删除密钥库。
  2.   

    rm -rf /root/keystore.ImportKey

    1. 将key.pem和cert.pem文件转换为二进制格式。
    2. 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. 将密钥和证书添加到java密钥库。
      2. 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密钥库。
        2. ./keytool -import -keystore /root/keystore.ImportKey  -storepass importkey -alias cacertificates -file /etc/bloomburg-live/CAcert.pem
          
          1. 对于错误跟踪,我将在我的java keytool中添加键列表。
          2. 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

            我收到以下错误消息。

              

            错误设置私钥5265:错误:0B080074:x509证书   例程:X509_check_private_key:键值不匹配:x509_cmp.c:398:

            请在执行openssl pubout命令后找到结果。

            openssl rsa -in key.pem -pubout
            
              

            -----开始公共密钥----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6dMX7GxbEtAmdQarwHXQ   d46c7oSrSjATTd1 / KHvS7KojHZV9XE3d4Foh1rP1czla6uxMV5p0jSPq4RzWOZlY   i8TzJMXPhz9onDPUErTmkKB1cYvzdYUjuAan4KduB / OWP + ubUS24DTZ + / RJ7SUX /   / UOcWgg232sc / sg9pcyysCRMXJUsPe5a94ztboOWr987 + dnjl / t1atNRCvVObkqG   Fq6pmsKKjTR0Cl1i5wFK8G8cak / cnGABhnmCBEP6v5udzgTt8QOSqg0Mb3TyhXia   MnhA7SBc7cu6NEsizxLMM34G + thDxg / s0RobuBirz5KZl3GC1KgR50Ggm // 5 / vJv   uwIDAQAB   ----- END PUBLIC KEY -----

            在接受的答案后添加。 请在dave的回答中找到我的最终评论。这是解决这个问题的更多事情和细节。

1 个答案:

答案 0 :(得分:3)

Meta:不是一个明确或完整的答案,而是评论过多。

好的,openssl s_client显示您的密钥和您声明的证书之间不匹配。您需要确定是否确实存在不匹配,或者您的数据只是异常结构化。

查看certificate.pem文件,通常使用moreless等寻呼机,因为它可能很长;它应该包含至少一个行(每个):

  • 以插入-----BEGIN CERTIFICATE-----的行X.509开头;
  • 然后是几行(通常是10-20但可能更多)完全由字母,数字,加号+和斜杠/组成,通常等号=结束;和
  • 最后再次行-----END CERTIFICATE-----,可能X.509

每个块都是证书。在这些可能有用的块之前,之间或之后可能还有其他数据(例如&# 39;友好的名字'或者#key;')或者可能是无用的甚至是垃圾。如果-----BEGIN和base64以及-----END的任何块都不是[X.509] CERTIFICATE,那么事情就会搞砸了。发布详情。

如果有一个证书(并且它与密钥不匹配),那么您提供的数据就很糟糕。回到源代码并让他们修复它。 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

如果它显示No certificate matches private key您的certificate.pem文件错误或损坏,以某种方式使其无法使用。请将它发布给我们试图找出,最好只使用您的私钥的公共部分,即openssl rsa -in key.pem -pubout,或者回到您的来源。

如果pkcs12 -export成功,那么您的certificate.pem确实包含了s_client所要求的传统顺序所必需的证书,并且您使用的过程也需要隐式。现在您可以使用

简单地将p12转换为JKS
keytool -importkeystore -srcstore temp.p12 -srcstoretype pkcs12 -deststore good.jks

如果您需要在密钥库中使用其CAcert,请对此文件执行keytool -import -file CAcert.pem步骤。使用结果。