2014-04-16 17 views
7

Ich bin neu bei Python und lerne es immer noch so meine Frage kann naiv sein. Bitte tragen Sie damit;)CSR von Client mit CA-Stammzertifikat in Python signieren

Das Problem ist Client wird CSR senden und ich möchte es mit meinem CA-Stammzertifikat signieren und das signierte Zertifikat zurück an den Client.

Ich habe diesen Befehl benutzen es Befehlszeile

openssl x509 -req -in device.csr -CA root.pem -CAkey root.key -CAcreateserial -out device.crt -days 500 mit zu tun

gleiche Sache, die ich mit Python erreichen möchte. Ich habe Python-Bibliothek für openssl pyopenssl

ist es möglich, mit dieser Bibliothek? Wie ? oder soll ich M2Crypto nehmen?

Antwort

8

Sie können tatsächlich mit pyOpenSSL gehen. Wie Sie sagen, haben Sie bereits CA-Root-Zertifikat und einen privaten Schlüssel, und CSR wird von einem Client gesendet, dann können Sie Funktionen von Crypto verwenden, um all diese zu lesen (CA-Zertifikat, privater Schlüssel und Device CSR) sie im Puffer.

Verwenden Sie die folgenden Funktionen, um mit zu beginnen. Prüfen dir(crypto) and crypto.function_name.__doc__ auf Python-Interpreter für weitere Informationen :) müssen Sie Krypto importieren aus pyOpenSSL

  1. crypto.load_certificate_request() - Gerät CSR obj
  2. crypto.load_privatekey() zu bekommen - privaten Schlüssel obj für CA erhalten privaten Schlüssel
  3. crypto.load_certificate() - CA root-Zertifikat

zu bekommen, dann können Sie einfach funcation schreiben Zertifikat zurück

def create_cert(): 
    cert = crypto.X509() 
    cert.set_serial_number(serial_no) 
    cert.gmtime_adj_notBefore(notBeforeVal) 
    cert.gmtime_adj_notAfter(notAfterVal) 
    cert.set_issuer(caCert.get_subject()) 
    cert.set_subject(deviceCsr.get_subject()) 
    cert.set_pubkey(deviceCsr.get_pubkey()) 
    cert.sign(CAprivatekey, digest) 
    return cert 

wo cacert, deviceCsr und CAprivatekey sind Werte von den oben genannten drei funcations. Jetzt, da Sie ein Zertifikat für sich haben, können Sie dieses in eine Datei schreiben, indem Sie crypto.dump_certificate(crypto.FILETYPE_PEM, cert) mit dem Dateinamen Ihrer Wahl verwenden.

Sie können diese Funktion gemäß Ihrer Anforderung ändern. Danach können Sie das generierte Gerätezertifikat mit dem CA-Root-Zertifikat mit dem openssl-Befehl überprüfen, z. openssl verify -CApath <CA cert path> <name of device cert file>

Sie können auch einige Beispiele von github durchgehen. M2Crypto Example, pyOpenSSL example

Hoffnung, das gibt Ihnen Idee über die Umsetzung