gpt4 book ai didi

ssl - 将私钥添加到 keystore

转载 作者:太空宇宙 更新时间:2023-11-03 13:21:34 24 4
gpt4 key购买 nike

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

我试着用谷歌搜索并通读了 SO 上的几个条目,但我只提出了一个解决方案,这看起来更像是一种解决方法,而不是一种好的方法,所以我想知道是否有人有更好的方法如何注入(inject)私钥并以更简单的方式从 jks keystore 转换为 PKCS#12 keystore 。

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

假设我有私钥作为 pem 文件。

  1. 使用 key 工具从 jks keystore 中提取了所有证书。
  2. 使用 openssl 创建了一个 PKCS#12 keystore
  3. 使用 keytool 重命名创建的 PKCS12 中的别名
  4. 使用 openssl 创建另一个 PKCS#12 keystore
  5. 使用 key 工具重命名其他创建的 PKCS#12 中的别名
  6. 使用 key 工具将两个 keystore 合并为一个
  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. 您可以通过在 pkcs12 上使用 -name long-name short 来消除 -changealias 步骤 -导出步骤

  2. 对于 keystore.p12keystore2.p12 你的输入是 key.pem 和 (cert) alias .short.pem。您是否打算对其中之一使用 (cert) alias.long.pem

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

  4. FWIW,如果您将原始 JKS(带有 trustedCert's)转换为 P12(仅带有 j8+),则 openssl pkcs12 -nokeys 将在一次操作中输出所有受信任的证书——但是由于您需要对它们做不同的事情,您需要将其拆分为单独的文件,或者按需执行,例如:

    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

... which I'm not sure is really an improvement

Alternatively, since this is SO, you could write a program that does this more directly:

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

关于ssl - 将私钥添加到 keystore ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50573426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com