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
Répondre
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).
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:
- http://koji.fedoraproject.org/koji/packageinfo?packageID=6444
- http://koji.fedoraproject.org/koji/buildinfo?buildID=185589
Il est aussi dans CVS:
:pserver:[email protected]:/cvsroot/mozilla/security/python/nss
J'ai commencé à implémenter un générateur CSR en utilisant PyCrypto et PyASN1 au cours des derniers jours. Le premier code est disponible à https://github.com/jandd/python-pkiutils
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
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. –