Ssl 向密钥库添加私钥

Ssl 向密钥库添加私钥,ssl,openssl,keytool,pkcs#12,jks,Ssl,Openssl,Keytool,Pkcs#12,Jks,为了更新一些证书,我必须将jks密钥库转换为PKCS#12密钥库,并在转换过程中包括私钥。我们将密钥存储库作为JKS密钥存储库接收,但是我们的Web服务器使用PKCS#12密钥存储库,并且我们接收的密钥存储库仅包含证书,而不包含私钥 我试着在SO上搜索并阅读了几个条目,但我只找到了一个解决方案,这似乎更像是一个解决方案,而不是一个好方法,所以我想知道是否有人有更好的方法来注入私钥,并以更简单的方式将jks密钥库转换为PKCS#12密钥库 似乎JKS密钥库只能由keytool操作,但是keytoo

为了更新一些证书,我必须将jks密钥库转换为PKCS#12密钥库,并在转换过程中包括私钥。我们将密钥存储库作为JKS密钥存储库接收,但是我们的Web服务器使用PKCS#12密钥存储库,并且我们接收的密钥存储库仅包含证书,而不包含私钥

我试着在SO上搜索并阅读了几个条目,但我只找到了一个解决方案,这似乎更像是一个解决方案,而不是一个好方法,所以我想知道是否有人有更好的方法来注入私钥,并以更简单的方式将jks密钥库转换为PKCS#12密钥库

似乎JKS密钥库只能由keytool操作,但是keytool实用程序不支持将私钥注入trustedCertEntries AFAIK,因此我使用的方法如下:

假设我有私钥作为pem文件

  • 使用keytool从jks密钥库提取所有证书
  • 使用openssl创建PKCS#12密钥库
  • 使用keytool重命名创建的PKCS12中的别名
  • 使用openssl创建另一个PKCS#12密钥库
  • 使用keytool重命名其他创建的PKCS#12中的别名
  • 使用keytool将两个密钥库合并为一个密钥库
  • 导入非私钥证书
  • 因此,整个流程如下所示(如果需要):

    例如,我设想,如果我可以在导入私钥证书时设置别名,那么以后就不需要重命名别名了。可能吗

    无论如何,先谢谢你

  • 通过在
    pkcs12-导出
    步骤上使用
    -name long
    -name short
    可以消除
    -changealis
    步骤

  • 对于
    keystore.p12
    keystore2.p12
    而言,您的输入是
    key.pem
    和(cert)
    alias.short.pem
    。您是否打算为其中一个使用(cert)
    别名.long.pem

  • 在免费的Oracle java中,只有j8的更高版本(在java.security中设置了keystore.compat)可以在不指定类型的情况下读取JKS和P12密钥库。默认情况下,j7和更低版本只执行JKS,j9和更高版本只执行P12

  • FWIW,如果您将原始JKS(使用trustedCert)转换为P12(仅使用j8+),则
    openssl pkcs12-nokeys
    将在一次操作中输出所有trustedCert——但由于您需要对其执行不同的操作,因此需要将其拆分为单独的文件,或者按需执行以下操作:


  • 我假设你只需要做一次(或者一年一次)。在这种情况下,基于GUI的程序比糟糕的旧键盘工具简单得多。我建议使用开源软件。AFAIR应该能够加载JKS密钥库并将其保存为PKCS#12。如果您将私钥发送给其他任何人,那么您就已经致命地泄露了它。从他们没有归还的事实来看,他们一开始就不需要它。在任何情况下,您现在需要做的就是将更新的证书导入到原始的JKS密钥库中,该密钥库已经具有私钥。但是你真的需要重新设置密钥。@EJP也许我不够清楚,但是私钥从未发送到另一部分。我刚刚发送了用公钥签名的CSR,得到了一个带有证书的.JKS文件。@Robert这可能是一个可行的解决方案。谢谢你的建议1)是的,这确实可以帮我省下两步。2) 是的,你是对的。这是一个剪切粘贴错误,但证书是相同的,只是别名不同。3) 感谢信息4)可能会简化它,但感谢信息java解决方案似乎很有趣。。。但我仍然惊讶于将私钥注入密钥库是如此复杂。。。我本来以为这是操作团队的标准操作,但也许我错了。我会加上你的投票权,但我需要15个声望点,所以我只能在评论中这样做,因为你可以使用复选标记来接受你认为解决了问题的答案(或者,如果你认为最好的话)。--这也意味着Q不再被列为其他人的“未回答”问题。
    openssl pkcs12 -in orig.alias.p12 -nodes -nocerts -out key.pem -passin pass:PASSWORD
    keytool -keystore keystore1 -storepass PASSWORD -list
    keytool -keystore keystore1 -storepass PASSWORD -rfc -file alias.root.pem -alias "root" -exportcert
    keytool -keystore keystore1 -storepass PASSWORD -rfc -file alias.ca3.pem -alias "ca3" -exportcert
    keytool -keystore keystore1 -storepass PASSWORD -rfc -file alias.long.pem -alias "long" -exportcert
    keytool -keystore keystore1 -storepass PASSWORD -rfc -file alias.short.pem -alias "short" -exportcert
    openssl pkcs12 -export -out keystore.p12 -inkey key.pem -in alias.short.pem -passout pass:PASSWORD
    keytool -changealias -alias "1" -destalias "short" -keypass PASSWORD -keystore keystore.p12 -storepass PASSWORD
    openssl pkcs12 -export -out keystore2.p12 -inkey key.pem -in alias.long.pem -passout pass:PASSWORD
    keytool -changealias -alias "1" -destalias "long" -keypass PASSWORD -keystore keystore2.p12 -storepass PASSWORD
    keytool -importkeystore -srckeystore keystore2.p12 -srcstoretype pkcs12 -srcstorepass PASSWORD -destkeystore keystore.p12 -deststoretype pkcs12 -deststorepass PASSWORD
    keytool -keystore keystore.p12 -storepass PASSWORD -file alias.ca3.pem -alias "ca3" -importcert -noprompt
    keytool -keystore keystore.p12 -storepass PASSWORD -file alias.root.pem -alias "root" -importcert  -noprompt
    keytool -keystore keystore.p12 -storepass PASSWORD -list
    
    awk '/friendlyName: short/,/-END CERT/' allcerts.pem | \ openssl pkcs12 -export -inkey key.pem -name short -out file -passout pass:PW # similar for long -- or make loop # combine the p12s as before awk '/friendlyName: root/,/-END CERT/' allcerts.pem | \ keytool -keystore file -storepass PW -importcert -file root.pem -alias root -noprompt # similar for ca3 -- or make loop
    char[] pw = "PASSWORD".toCharArray(); // or whatever as appropriate
    KeyStore ks1 = KeyStore.getInstance("JKS"); ks1.load (new FileInputStream ("certs",pw));
    KeyStore ks2 = KeyStore.getInstance("PKCS12"); 
    try( InputStream is = new FileInputStream("oldp12") ){ ks2.load(is,pw); }
    String alias = ks2.getAliases().nextElement(); // assume only one
    PrivateKey key = (PrivateKey) ks2.getKey(alias,pw); 
    ks2.deleteAlias(alias); 
    ks2.setKeyEntry("short",key,pw,new Certificate[]{ ks1.getCertificate("short") });
    ks2.setKeyEntry("long" ,key,pw,new Certificate[]{ ks1.getCertificate("long" ) });
    // assuming those combinations are what you intended, see above
    ks2.setCertificateEntry("root", ks1.getCertificate("root") );
    ks2.setCertificateEntry("ca3" , ks1.getCertificate("ca3" ) );
    try( OutputStream os = new FileOutputStream ("newp12") ){ ks2.store(os,pw); }