2010-07-09 142 views
1

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

+0

你不能使用任何工具包,或只是OpenSSL? 如果您有权访问ASN.1编码器,则PKCS#10(证书请求格式)非常简单。 – 2010-07-16 04:28:58

回答

-2

与其他语言一样,Python只是实现算法。我几乎不知道密码学,但是如果我必须在Python中实现这一点,我会寻找一个关于如何实现CSR的规范。

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

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

1

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

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

这也是在CVS:

:pserver:[email protected]:/cvsroot/mozilla/security/python/nss 
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