在Python中生成CSR

3 投票
3 回答
7536 浏览
提问于 2025-04-16 01:04

我想在Python中生成一个证书签名请求(CSR),但不想使用OpenSSL。如果有人能给我指个方向,我会非常感激。

3 个回答

-6

就像任何编程语言一样,Python 也只是用来实现算法的。我对密码学几乎一无所知,但如果让我用 Python 来实现这个功能,我会先找一个关于如何实现 CSR 的说明文档。

通过谷歌和维基百科,我找到了这个 RFC 文档。你的任务就是用 Python 来实现这个内容。

就我个人而言,我可能会先尝试使用命令行工具(如果需要从 Python 调用的话,可能会用到 system() 函数)。

1

m2crypto 可能是一个解决方案(可以查看 contrib 示例中的 CreateX509Request),不过它是依赖于 OpenSSL 的。

你也可以使用 python-nss,这个库使用的是 Mozilla 的 NSS 库。最近才添加了 nss.nss.CertificateRequest。目前网站上的 API 文档不是最新的,但这里有一些关于新版本的提示:

它也在 CVS 中:

:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot/mozilla/security/python/nss 
4

我猜你不想直接使用命令行的openssl,而是想用Python的库来实现。

这里有一个我写的辅助函数,用来创建一个证书签名请求(CSR)。这个函数会返回生成的密钥对中的私钥和CSR。这个函数依赖于pyOpenSSL.crypto这个库。

def create_csr(self, common_name, country=None, state=None, city=None,
               organization=None, organizational_unit=None,
               email_address=None):
    """
    Args:
        common_name (str).

        country (str).

        state (str).

        city (str).

        organization (str).

        organizational_unit (str).

        email_address (str).

    Returns:
        (str, str).  Tuple containing private key and certificate
        signing request (PEM).
    """
    key = OpenSSL.crypto.PKey()
    key.generate_key(OpenSSL.crypto.TYPE_RSA, 2048)

    req = OpenSSL.crypto.X509Req()
    req.get_subject().CN = common_name
    if country:
        req.get_subject().C = country
    if state:
        req.get_subject().ST = state
    if city:
        req.get_subject().L = city
    if organization:
        req.get_subject().O = organization
    if organizational_unit:
        req.get_subject().OU = organizational_unit
    if email_address:
        req.get_subject().emailAddress = email_address

    req.set_pubkey(key)
    req.sign(key, 'sha256')

    private_key = OpenSSL.crypto.dump_privatekey(
        OpenSSL.crypto.FILETYPE_PEM, key)

    csr = OpenSSL.crypto.dump_certificate_request(
               OpenSSL.crypto.FILETYPE_PEM, req)

    return private_key, csr

撰写回答