首页 > 解决方案 > 如何使用加密模块转换 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 模块密码学进行这些转换的方法吗?

标签: python-3.x

解决方案


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

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


推荐阅读