如何/如何使用 python 和加密模块生成 PKCS#12 文件?

Tra*_*ggs 8 python pkcs#12 python-3.x python-cryptography

如何/如何使用 python 和加密模块生成 PKCS#12 文件?

使用上述模块为私钥生成 .pem 文件的内容非常简单:

keyPEMBytes = privateKey.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncryption())
Run Code Online (Sandbox Code Playgroud)

也很容易为关联的证书生成 .cer/.pem 文件的内容:

certBytes = certificate.public_bytes(encoding=serialization.Encoding.PEM)
Run Code Online (Sandbox Code Playgroud)

但是我需要将它们(和它们的链)整合到一个 .p12(PKCS12 文件)中。所述模块记录了如何解析/使用 PKCS12 格式,但没有(我能找到的)关于如何生成它们的信息。

不过,我对 PKI 内容的理解是偶然的,所以也许我只是没有在文档中搜索正确的关键字?

可以使用 Linux 在命令行中创建 .p12 文件

openssl pkcs12 -export -out myIdentity.p12 -inkey myPrivKey.pem -in myCert.crt -certfile myCertChain.crt
Run Code Online (Sandbox Code Playgroud)

所以我可以用 subprocess/cmd 来包装这样的调用,并用临时文件/管道来处理。不过,我希望将其全部保存在内存/python 中。

是否有我应该考虑的不同的 python TLS 库,可以做到这一点?

Pau*_*rer 9

正如您所指出的,cryptography可以使用load_key_and_certificates解析 PKCS12(至少是 99.99% 的人使用的子集),但目前不支持序列化到 PKCS12。

我是该项目的核心开发人员之一,一般来说cryptography,功能集是由用户提交的问题驱动的,这些问题解释了他们的用例和对特定功能的需求。我建议在跟踪器上写一些东西以供讨论。听起来您的需求将被一个简单的 API 满足,大致如下:

from cryptography.hazmat.primitives.serialization.pkcs12 import generate_pkcs12

pem_pkcs12 = generate_pkcs12(
    BestAvailableEncryption(b"somepassword"), 
    key, 
    [cert1, cert2]
)
Run Code Online (Sandbox Code Playgroud)

更新:此功能在 pyca/cryptography 3.0 中实现:

https://cryptography.io/en/latest/hazmat/primitives/asymmetric/serialization.html?highlight=pkcs12#cryptography.hazmat.primitives.serialization.pkcs12.serialize_key_and_certificates