python-3.x - 如何使用加密模块转换 SSL 证书 PEM <--> PKCS#12/PFX 和 PEM <--> PKCS#7/P7B
问题描述
我想使用 python 进行一些 SSL 证书转换,特别是在:PEM <--> PFX PEM <--> P7B
我已经有了 PEM <--> DER 的解决方案。即:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.x509 import (
load_der_x509_certificate,
load_pem_x509_certificate,
)
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
cert = form.cleaned_data.get('file')
der_file = pem_to_der(cert)
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
cert = form.cleaned_data.get('file')
pem_file = der_to_pem(cert)
def pem_to_der(cert):
try:
cert_to_der = load_pem_x509_certificate(cert.read(),
default_backend())
except ValueError:
return False
return cert_to_der.public_bytes(serialization.Encoding.DER)
def der_to_pem(cert):
try:
cert_to_der = load_der_x509_certificate(cert.read(),
default_backend())
except ValueError:
return False
return cert_to_der.public_bytes(serialization.Encoding.PEM)
我确实有一个使用 subprocess.call 的解决方案,如:
def pem_to_pfx(private_key_path, cert_path, name, passwd):
return subprocess.call("openssl pkcs12 -export -out " + "tmp/"
+ name + ".pfx" + " -password pass:" + passwd + " -inkey "
+ private_key_path + " -in " + cert_path, shell=True)
但我宁愿避免这种情况。有人知道使用 python 模块密码学进行这些转换的方法吗?
解决方案
cryptography
目前不支持序列化为 PKCS12/PFX 或 PKCS7(尽管它可以解析 PKCS12)。该项目通过具有具体用例的用户报告确定开发优先级,因此请提交问题!
作为权宜之计,您可以使用 pyOpenSSL(使用cryptography
's 绑定)生成 PKCS12,但我们更愿意构建一个好的 API,您可以直接使用而无需额外的依赖。