Da die M2Crypto-Bibliothek für Python 3 nicht verfügbar ist, suche ich nach einer Möglichkeit, ein X509-Zertifikat einzulesen, den öffentlichen Schlüssel daraus zu extrahieren und für die RSA-Verschlüsselung zu verwenden.
Ich habe derzeit die folgenden beiden Funktionen:
from ssl import PEM_cert_to_DER_cert # Standardbibliothek
from Crypto.Util import asn1 # http://pycrypto.org
from OpenSSL.crypto import * # https://pythonhosted.org/pyOpenSSL/
def extract_publickey_1(certstr):
""" von http://stackoverflow.com/questions/12911373 """
der = PEM_cert_to_DER_cert(certstr)
cert = asn1.DerSequence()
cert.decode(der)
tbs = asn1.DerSequence()
tbs.decode(cert[0])
return tbs[6]
def extract_publickey_2(certstr):
return dump_privatekey(FILETYPE_ASN1,
load_certificate(FILETYPE_PEM, certstr).get_pubkey())
Die erste Funktion wirft für einige Zertifikate einen IndexError
aus, insbesondere für diejenigen, die nicht aus der OpenSSL-Befehlszeile generiert wurden, sondern aus einer kryptografischen Bibliothek (Python- und C#-Bibliotheken wurden getestet). Sie funktioniert für Zertifikate, die mit der OpenSSL-Befehlszeile generiert wurden.
Ich habe die Ausgabe der zweiten Funktion untersucht und sie war nicht identisch mit der ersten, aber die letzten 266 Byte der Ausgabe sind äquivalent:
extract_publickey_1(certstr)[-266:] == extract_publickey_2(certstr)[-266:]
gibt True
zurück.
Meine Frage ist, was passiert hier? Gibt es eine Lösung dafür?