2010-07-09 4 views
1

J'essaye de générer un CSR en Python sans utiliser OpenSSL. Si quelqu'un pouvait pointer dans la bonne direction, je serais très reconnaissant.Générer un CSR en Python

+0

N'êtes-vous pas en mesure d'utiliser une boîte à outils, ou simplement OpenSSL? PKCS # 10 (format de requête cert) est assez simple si vous avez accès à un codeur ASN.1. –

Répondre

-2

Comme n'importe quel langage, Python implémente seulement des algorithmes. Je ne connais presque rien à la cryptographie, mais si je devais l'implémenter en Python, je chercherais une spécification sur la façon d'implémenter la RSE.

Via Google et Wikipedia, j'ai trouvé this RFC. Votre tâche serait de l'implémenter en Python.

Personnellement, j'essaierais probablement d'abord d'utiliser l'outil de ligne de commande (peut-être via un appel à la fonction system() s'il devait provenir de Python).

1

m2crypto peut être une solution (voir CreateX509Request in the contrib example), même si elle repose sur OpenSSL. Vous pouvez également utiliser python-nss, qui utilise Mozilla's NSS library. nss.nss.CertificateRequest a été ajouté récemment. La documentation de l'API disponible pour le moment sur le site ne sont pas à jour, mais voici quelques conseils pour les versions plus récentes:

Il est aussi dans CVS:

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

Je suppose que vous ne voulez pas utiliser la ligne de commande openssl elle-même et une librairie Python est ok.

Voici une fonction auxiliaire que j'ai écrite pour créer un CSR. Il renvoie la clé privée de la paire de clés générée et du CSR. La fonction dépend de 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 
Questions connexes