2016-08-05 8 views
3

So ein neues CA-Zertifikat mit diesem Code Ich versuche, das OpenSSL Crypto-Modul zu verwenden, erzeugen:OpenSSL.crypto.X509.sign() throws „‚Bytes‘Objekt kein Attribut‚kodieren‘hat“

#warning: this block is background information, probably not 
#where my real problem is 

#generate the key pair 
key=OpenSSL.crypto.PKey() 
key.generate_key(OpenSSL.crypto.TYPE_RSA,2048) 

#print the private and public keys as PEMs 
print(codecs.decode(OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM,key),'utf8')) 
print(codecs.decode(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM,key),'utf8')) 

#generate a new x509 certificate 
ca=OpenSSL.crypto.X509() 

#fill it with goodies 
ca.set_version(3) 
ca.set_serial_number(1) 
ca.get_subject().CN = "CA.test.com" 
ca.gmtime_adj_notBefore(0) 
ca.gmtime_adj_notAfter(60 * 60 * 24 * 365 * 10) 
ca.set_issuer(ca.get_subject()) 
ca.set_pubkey(key) 

#print the new certificate as a PEM 
print(codecs.decode(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM,ca),'utf8')) 

Das Zertifikat, das ausdruckt, dekodiert OK bei der SSLShopper certificate decoder, so dass ich ziemlich zuversichtlich bin über diesen Teil. Das Problem wirklich beginnt, wenn ich versuche, das Zertifikat zu signieren mit

ca.sign(key, 'sha1') 

, weil ich eine bekommen „erwarteten Typ‚Bytes‘erwartet,‚str‘anstelle“ von der IDE. Überprüfen Sie die OpenSSL.crypto.X509.sign() Dokumentation und bestätigen Sie es wirklich ein Byte Objekt erwartet, wechseln Sie in

digestname='sha1'.encode('utf-8') 
ca.sign(key, digestname) 

und ich erhalte eine „Attribute:‚Bytes‘Objekt hat kein Attribut‚kodieren‘“ Ausnahme. Schreiten durch den Code finde ich die Ausnahme in OpenSSL._util.byte_string geworfen wird(), weil

if PY3: 
    def byte_string(s): 
    return s.encode("charmap") 
else: 
    def byte_string(s): 
    return s 

wo PY3 = True und s = {} Bytes b'sha1' , was natürlich keine .encode Methode hat.

So begann meine demoralisierende 'Bytes' vs 'str' Kampf. Ich möchte denken, dass ich nicht der Einzige bin, der dieses Problem hat, aber mein allerbester Google-Fu hat mich anders überzeugt. An diesem Punkt weiß ich nicht einmal, was ich sagen soll, um dieses herauszufinden.

Antwort

0

Es stellt sich heraus, dass meine IDE (PyCharm) mich in die Irre geführt hat. ca.sign(key, 'sha1') ist wirklich der richtige Weg, es zu tun. Obwohl PyCharm eine Typfehlerprogramm-Ausführung gibt, fließt die Ausführung durch die Anweisung und die Ausgabe ist korrekt.