2016-08-05 4 views
3

Je suis en train d'utiliser le module de chiffrement OpenSSL pour générer un nouveau certificat de CA avec ce code:OpenSSL.crypto.X509.sign() renvoie « l'objet 'octets n'a pas d'attribut de« encode »

#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')) 

Le certificat qui imprime décode OK au SSLShopper certificate decoder donc je suis assez confiant à propos de cette partie. Le problème commence vraiment lorsque je tente de signer le certificat avec

ca.sign(key, 'sha1') 

parce que je reçois un « type attendu « octets », obtenu « str » à la place » de l'IDE. Consultez la documentation OpenSSL.crypto.X509.sign() et confirmer qu'elle attend vraiment un objet octets, passez à

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

et je reçois un « AttributeError: l'objet 'octets n'a pas d'attribut de « encode » » exception. Parcourant le code que je trouve l'exception est levée dans OpenSSL._util.byte_string() parce que

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

où AP3 = True et s = {} octets b'sha1' , ce qui bien sûr n'a pas de méthode de .encode.

Ainsi commença ma lutte démoralisante entre 'bytes' et 'str'. Je voudrais penser que je ne suis pas le seul à avoir ce problème, mais mon meilleur Google-fu m'a convaincu du contraire. À ce stade, je ne sais même pas quoi lire lire pour obtenir ce compris.

Répondre

0

Il s'est avéré que mon IDE (PyCharm) m'égarait. ca.sign(key, 'sha1') est vraiment la bonne façon de le faire. Même si PyCharm donne un programme d'erreur de type, l'exécution passe à travers l'instruction et la sortie est correcte.