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.