2010-07-09 23 views
1

OpenSSL을 사용하지 않고 Python으로 CSR을 생성하려고합니다. 누군가가 올바른 방향을 가리킬 수 있다면, 나는 매우 감사 할 것입니다.Python에서 CSR 생성

+0

어떤 툴킷이나 OpenSSL을 사용할 수 없습니까? ASN.1 인코더에 액세스하면 PKCS # 10 (인증서 요청 형식)이 매우 간단합니다. –

답변

-2

다른 언어와 마찬가지로 Python도 알고리즘을 구현합니다. 암호화에 관해서는 알지 못하지만, 이것을 파이썬으로 구현해야한다면, CSR을 구현하는 방법에 대한 스펙을 찾을 것입니다.

Google 및 위키 백과를 통해 나는 this RFC을 발견했습니다. 당신의 임무는 이것을 파이썬으로 구현하는 것입니다.

개인적으로는 아마도 먼저 명령 줄 도구를 사용하려고합니다 (아마도 파이썬에서 필요하면 system() 함수 호출을 통해).

1

m2crypto은 OpenSSL을 사용하지만 해결책이 될 수 있습니다 (CreateX509Request in the contrib example 참조).

을 사용하는 python-nss을 사용할 수도 있습니다. nss.nss.CertificateRequest이 아주 최근에 추가되었습니다. 웹 사이트의 순간에 사용할 수있는 API 설명서를하지 최신이지만, 여기에 새 버전에 대한 몇 가지 포인터 :

그것은 CVS도있다 :

:pserver:[email protected]:/cvsroot/mozilla/security/python/nss 
3

명령 줄을 사용하고 싶지는 않지만 openssl 자체를 사용하고 Python 라이브러리는 ok라고 가정합니다.

다음은 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