我在 Windows 7 上有 OpenSSL x64,它是从Google Code 上的 openssl-for-windows下载的。我正在尝试运行:
openssl pkcs12 -export -in "path.p12" -out "newfile.pem"
但我得到一个错误。
unable to load private key
如何使用 OpenSSL 从 PKCS#12 存储中提取 PEM 中的证书?
我在 Windows 7 上有 OpenSSL x64,它是从Google Code 上的 openssl-for-windows下载的。我正在尝试运行:
openssl pkcs12 -export -in "path.p12" -out "newfile.pem"
但我得到一个错误。
unable to load private key
如何使用 OpenSSL 从 PKCS#12 存储中提取 PEM 中的证书?
尝试:
openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes
之后你有:
要在没有密码的情况下将证书和密钥放在同一个文件中,请使用以下内容,因为空密码将导致无法导出密钥:
openssl pkcs12 -in path.p12 -out newfile.pem -nodes
或者,如果您想为私钥提供密码,请省略-nodes
并输入密码:
openssl pkcs12 -in path.p12 -out newfile.pem
如果您需要直接从命令行(例如脚本)输入 PKCS#12 密码,只需添加-passin pass:${PASSWORD}
:
openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'
您只需要提供密码。您可以使用以下语法在同一命令行中执行此操作:
openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]
然后将提示您输入密码以加密输出文件中的私钥。如果要导出未加密的私钥(明文),请在上面的行中包含“节点”选项:
openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes
pyopenssl
如果您可以使用 Python,那么如果您有模块,那就更容易了。这里是:
from OpenSSL import crypto
# May require "" for empty password depending on version
with open("push.p12", "rb") as file:
p12 = crypto.load_pkcs12(file.read(), "my_passphrase")
# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())
# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())
有一个免费的开源 GUI 工具KeyStore Explorer可用于处理加密密钥容器。使用它,您可以将证书或私钥导出到单独的文件中,或将容器转换为另一种格式(jks、pem、p12、pkcs12 等)
我有一个 PFX 文件,需要为 NGINX 创建 KEY 文件,所以我这样做了:
openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes
然后我不得不编辑 KEY 文件并删除所有内容,直到-----BEGIN PRIVATE KEY-----
. 之后 NGINX 接受了 KEY 文件。
#!/usr/bin/env python3
from optparse import Option
from OpenSSL import crypto
import os
import warnings
from getpass import getpass
warnings.filterwarnings("ignore", category=DeprecationWarning)
def sanitize_path(path):
return os.path.expandvars(os.path.expanduser(path))
def main(in_file, out_file, passphrase=None):
if not passphrase:
passphrase = getpass(prompt=("SSL Private Key Passphrase: "))
in_file = sanitize_path(in_file)
out_file = sanitize_path(out_file)
with open(in_file, "rb") as input_file:
p12 = crypto.load_pkcs12(input_file.read(), passphrase)
pem = crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())
with open(out_file, "w") as output_file:
output_file.write(pem.decode('utf-8'))
if __name__ == '__main__':
from optparse import OptionParser
usage = "usage: %prog input_file output_file [passphrase]"
p = OptionParser(usage=usage)
opt, args = p.parse_args()
main(*args)