12

我是 python 新手,还在学习它,所以我的问题可能有点幼稚。请多多包涵;)

问题是客户端将发送 CSR,我想用我的 CA 根证书对其进行签名并将签名的证书返回给客户端。

我一直在使用这个命令来做它使用命令行

openssl x509 -req -in device.csr -CA root.pem -CAkey root.key -CAcreateserial -out device.crt -days 500

我想用python实现同样的事情。我遇到了用于 openssl pyopenssl的 python 库

可以使用这个库吗?如何 ?还是我应该选择 M2Crypto ?

4

2 回答 2

18

您确实可以使用 pyOpenSSL。正如您所说,您已经拥有 CA 根证书和私钥,并且 CSR 将由客户端发送,然后您可以使用加密功能从文件中读取所有这些(CA 证书、私钥和设备 CSR)或设法拥有他们在缓冲区。

使用以下功能开始。检查dir(crypto) and crypto.function_name.__doc__python 解释器以获取更多信息 :) 您需要从 pyOpenSSL 导入加密

  1. crypto.load_certificate_request() - 获取设备 CSR obj
  2. crypto.load_privatekey() - 获取 CA 私钥的私钥 obj
  3. crypto.load_certificate() - 获取 CA 根证书

然后你可以编写简单的函数来返回证书

def create_cert():
    cert = crypto.X509()
    cert.set_serial_number(serial_no)
    cert.gmtime_adj_notBefore(notBeforeVal)
    cert.gmtime_adj_notAfter(notAfterVal)
    cert.set_issuer(caCert.get_subject())
    cert.set_subject(deviceCsr.get_subject())
    cert.set_pubkey(deviceCsr.get_pubkey())
    cert.sign(CAprivatekey, digest)
    return cert

其中caCertdeviceCsrCAprivatekey是来自上述三个函数的值。现在您已经有了证书,您可以使用crypto.dump_certificate(crypto.FILETYPE_PEM, cert)您选择的文件名将其写入文件。

您可以根据需要修改此功能。在此之后,您可以使用 openssl 命令使用 CA 根证书验证生成的设备证书,例如openssl verify -CApath <CA cert path> <name of device cert file>

您还可以浏览 github 中的一些示例。 M2Crypto 示例pyOpenSSL 示例

希望这能让您对实施有所了解

于 2014-04-16T19:37:06.617 回答
5

的维护者pyOpenSSL建议使用cryptography模块进行 X509 操作(请参阅文档页面顶部的注释:https ://www.pyopenssl.org/en/stable/api/crypto.html )。

以下是从 CA 签名的 CSR 创建证书的代码:

def sign_certificate_request(csr_cert, ca_cert, private_ca_key):
    cert = x509.CertificateBuilder().subject_name(
        csr_cert.subject
    ).issuer_name(
        ca_cert.subject
    ).public_key(
        csr_cert.public_key()
    ).serial_number(
        x509.random_serial_number()
    ).not_valid_before(
        datetime.utcnow()
    ).not_valid_after(
        # Our certificate will be valid for 10 days
        datetime.utcnow() + timedelta(days=10)
    # Sign our certificate with our private key
    ).sign(private_ca_key, hashes.SHA256())

    # return DER certificate
    return cert.public_bytes(serialization.Encoding.DER)
  • csr_cert 是cryptographyCSR 证书对象 - 可以从文件加载x509.load_der_x509_csr()
  • ca_cert 是cryptography证书对象 - 可以从文件中加载x509.load_pem_x509_certificate()
  • private_ca_key 是cryptography私钥对象 - 可以从文件中加载serialization.load_pem_private_key()
于 2021-01-13T22:17:18.030 回答