2010-07-09 66 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