当前位置: 首页 > 知识库问答 >
问题:

向密钥库添加私钥

宣熙云
2023-03-14

为了更新一些证书,我必须将jks密钥库转换为PKCS#12密钥库,并在转换过程中包含私钥。我们收到的密钥库是JKS密钥库,但是我们的网络服务器使用PKCS#12密钥库,我们收到的密钥库只包含证书,而不包含私钥。

我试着用谷歌搜索并阅读SO的几个条目,我只想出了一个解决方案,这似乎更像是一个变通方法,而不是一个好的方法,所以我想知道是否有人有更好的方法如何注入私钥,并以更简单的方式从jks密钥库转换为PKCS#12密钥库。

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

假设我将私钥作为pem文件

  1. 使用keytool从jks密钥库提取了所有证书
  2. 使用openssl创建了PKCS#12密钥库
  3. 使用keytool重命名创建的PKCS12中的别名
  4. 使用openssl创建另一个PKCS#12密钥库
  5. 使用keytool重命名另一个创建的PKCS#12中的别名
  6. 使用keytool将两个密钥库合并为一个
  7. 导入非私钥证书

因此,整个流程如下(如果也需要):

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

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

无论如何,提前致谢

共有1个答案

阴凯歌
2023-03-14

>

  • 您可以通过在 pkcs12 导出步骤上使用 -name 长-name short 来消除 -changealias 步骤

    对于这两个密钥库。p12keystore2.p12您的输入是键。pem和(cert)alias.short.pem。您打算使用(cert)alias.long吗。其中一个的pem

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

    FWIW,如果您将原始的JKS(带有trustedCert)转换为P12(仅带有j8 ),那么< code > OpenSSL pkcs12-no keys 将在一次操作中输出所有的trusted cert——但是由于您需要对它们做不同的事情,因此您需要将其拆分为单独的文件,或者按需执行,例如:

        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
    

    ...我不确定这是否是一种进步

    或者,由于这是SO,您可以编写一个更直接执行此操作的程序:

    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); }
    

  •  类似资料:
    • 在SpringBoot中有一个“rest-server” 服务在某个地方安装了许多Java中的“rest-clients”。我不控制它。 “rest-server”为每个(!)生成公钥/私钥对客户端并与客户端共享pub密钥 每个“Rest-Client”生成自己的公钥/私钥对,并与“Rest-Server”共享公钥。客户端共享其公钥和唯一ID。 “Rest-Clients”不时轮询“”Rest-S

    • 资源组 集成帐户 密钥库 Active Directory 使用命令set-azurermkeyvaultaccesspolicy向我的用户授予所有密钥和机密的权限 每当我转到集成帐户>Certificates>Add>choose[Certificate Type]=“Private”时,组合框资源组和密钥库会自动填充,但密钥名称会抛出以下错误: 与密钥库[MY_KEY_VAULT]通信失败。请

    • 我在使用Java Bouncycastle的客户机和使用Python RSA库的密钥服务器之间交换私钥时遇到了困难。PEM格式用于通过REST传输密钥。keyserver无法解密我提供的密钥(加密密码更改时需要),它需要PKCS#1或PKCS#8密钥和PEM,如下所示: 但是BouncyCastle的输出(使用JCEpeEncryptorBuilder和JcaMiscPEMGenerator)的起

    • 并且我将这个函数称为用RSA公钥加密DSA密钥的函数:

    • 我试图在Azure Devops中进行ARM部署,从而在Azure中的现有密钥存储库中添加密钥存储库访问策略。