如何使用加密模块转换SSL证书PEM <-> PKCS#12 / PFX和PEM <-> PKCS#7 / P7B

时间:2019-06-24 07:33:33

标签: python-3.x

我想使用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模块密码术进行这些转换的方法吗?

1 个答案:

答案 0 :(得分:0)

cryptography当前不支持序列化到PKCS12 / PFX或PKCS7(尽管可以parse PKCS12)。该项目通过带有具体用例的用户报告来确定开发优先级,因此请提出问题!

作为权宜之计,您可以生成PKCS12 using pyOpenSSL(使用cryptography的绑定),但是我们更愿意构建一个可以直接使用而无需附加依赖项的良好API。