在Python中生成CSR

时间:2010-07-09 19:08:34

标签: python pki csr

我正在尝试在不使用OpenSSL的情况下在Python中生成CSR。如果有人能指出正确的方向,我将非常感激。

4 个答案:

答案 0 :(得分:3)

我假设您不想使用命令行openssl本身,并且Python lib也可以。

这是我为创建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

答案 1 :(得分:1)

m2crypto可能是一个解决方案(请参阅CreateX509Request in the contrib example),尽管它依赖于OpenSSL。

您还可以使用python-nss,它使用Mozilla's NSS library。最近添加了nss.nss.CertificateRequest。目前网站上提供的API文档不是最新的,但这里有一些针对较新版本的指示:

它也在CVS中:

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

答案 2 :(得分:1)

在过去的几天里,我开始使用PyCrypto和PyASN1实现CSR生成器。第一个代码位于https://github.com/jandd/python-pkiutils

答案 3 :(得分:-3)

与任何语言一样,Python只是实现算法。我对密码学几乎一无所知,但如果我必须在Python中实现这一点,我会寻找有关如何实现CSR的规范。

通过谷歌和维基百科,我找到了this RFC。您的任务是在Python中实现它。

就我个人而言,我可能首先尝试使用命令行工具(如果需要来自Python,可能通过调用system()函数)。