我有一个 JKS 格式的密钥库,我想将其与 apache2 一起使用。如何才能轻松地将密钥和证书(我已经链接的)从 JKS 中导出?我找到了很多答案,但似乎没有人遇到我的问题……(或者答案不完整)
感谢您的时间。
答案1
JKS 具有 DER 证书,而对于 Apache,您需要具有 PEM(AKA X509)格式。
如何执行此操作的示例:
$JAVA_HOME/bin/keytool --list -keystore <mykeystore>
$JAVA_HOME/bin/keytool -export -rfc -alias <alias_name> -file <cert.crt> -keystore <mykeystore>
因此您将需要导出私钥,然后导出证书。
导出的私钥随后会进入 httpd.conf 中的 SSLCertificateKeyFile 指令,您可以将链式证书放入 SSLCertificateChainFile 指令中。这是对 SSLCertificateFile 指令的补充。
答案2
您无法使用 keytool 直接从 JKS 获取私钥;而是必须先转换为 PKCS12 格式,然后使用 openssl 命令。我已经完成了这项工作:
使用 keytool 将密钥库转换为 pkcs12
keytool -importkeystore -srckeystore jks_filename.jks -destkeystore p12_filename.p12 -deststoretype PKCS12
使用 openssl 将证书导出为 .pem 文件:
openssl pkcs12 -in p12_filename.p12 -nokeys -clcerts -out cert_filename.pem
使用openssl将相应的私钥导出为.pem文件:
openssl pkcs12 -in p12_filename.p12 -nocerts -out key_filename.pem
在两个地方(SSLCertificateFile 和 SSLCertificateKeyFile)更新 ssl.conf 以配置端口 443 使用这些证书和密钥文件。
答案3
除了证书之外,没有其他方法可以“直接”导出任何东西。您需要执行 PKCS12 格式的中间步骤。
keytool -importkeystore -srckeystore rec.jks -destkeystore rec.p12 -deststoretype PKCS12
这将提示输入源和目标密码。如果您需要自动执行此操作,请使用PW=somepass keytool -srcpass:env PW ...
或keytool -srcstorepass:file filecontainingpass ...
,类似地,-deststorepass
从那里,您可以使用 openssl 将 PKCS12 文件转换为标准 PEM:
openssl pkcs12 -in rec.p12 -out rec.pem
这也会提示输入密码。如果您不想加密生成的密钥,请使用-passin env:PW
或-passin file:filename
和-passout
选项,或者,-nodes
但要小心将其写入的位置。
生成的文件将包含您的密钥、证书以及可能的完整证书链。