Extrahieren des Öffentlichen Schlüssels mit pyOpenSSL von Zertifikat oder andere Verbindungsinformationen
Derzeit bin ich versucht zu schreiben, ein python server script, das sollte die Authentifizierung der aktuellen client basierend auf Ihren öffentlichen Schlüssel. Da bin ich mit windenden, die Beispiel in der twisted-documenteation habe mich begonnen.
Während ich Schlüssel generieren, verbinden und kommunizieren mit dem Beispiel code, ich habe noch nicht einen Weg gefunden, um den öffentlichen Schlüssel des Clients in ein verwendbares format. In das stackexchange-Frage jemand extrahiert den öffentlichen Schlüssel aus einem OpenSSL.crypto.PKey
Objekt, kann aber nicht verwandeln es in ein lesbares format. Da habe ich Zugang zu den PKey
Objekt von x509-Zertifikat in der verifyCallback
Methode oder über self.transport.getPeerCertificate()
aus jede Methode meines Protokolls, das wäre ein guter Weg zu gehen. Der (nicht angenommenen) Antworten schlägt vor, zu versuchen crypto.dump_privatekey(PKey)
. Leider funktioniert das nicht so wirklich Ausbeute das erwartete Ergebnis:
Während die BEGIN PRIVATE KEY
und BEGIN PRIVATE KEY
in der Antwort könnte behoben werden, indem eine einfache text Ersatz-Funktion, die base64-string scheint nicht mit dem öffentlichen Schlüssel. Ich habe extrahiert den öffentlichen Schlüssel mit openssl rsa -in client.key -pubout > client.pub
wie bereits erwähnt hier. Es entspricht nicht das Ergebnis der dump_privatekey
Funktion.
Während es immer noch ein Fehler in Richtung OpenSSL auf launchpad, es steht noch nicht fest. Es wurde berichtet, 19 Monat, und es gibt einige aktuelle (Oktober 2012) - Aktivität auf, ich nicht haben jede Hoffnung auf ein schnelles Update in die repos.
Haben Sie andere Ideen, wie ich bekommen konnte, um den öffentlichen Schlüssel in einem format, das vergleichbar mit der client.pub
Datei, die ich oben erwähnt habe? Gibt es vielleicht eine verdrehte oder OpenSSL-Verbindung bestimmtes Objekt hält diese Informationen. Bitte beachten Sie, dass ich zum speichern der public-key in das Protokoll-Objekt, so dass ich später darauf zugreifen kann.
Warum ist keine Antwort akzeptiert?
M2Crypto von J. F. Sebastian
Sorry, das hatte ich nicht gedacht eine Möglichkeit, wo ich nicht korreliert das Zertifikat für die Verbindung. Ich habe die Anforderung, dass ich zum speichern der public-key innerhalb des Protokoll-Instanz. So, mit peerX509.as_pem()
innerhalb der postConnectionCheck
Funktion wie vorgeschlagen von J. F. Sebastian funktioniert nicht. Des weiteren, mindestens in der version 0.21.1-2ubuntu3 von python-m2crypto ich habe zu nennen peerX509.get_rsa().as_pem()
um den richtigen öffentlichen Schlüssel. Mit peerX509.as_pem(None)
(seit peerX509.as_pem()
will immer noch eine passphrase) Erträge excactly das gleiche Ausgang wie crypto.dump_privatekey(PKey)
in PyOpenSSL. Vielleicht gibt es einen Fehler.
Neben dieser, die Antwort zeigte mir einen möglichen Weg zu schreiben, eine andere Problemumgehung mithilfe der folgenden Echo
Protokoll Klasse:
class Echo(Protocol):
def dataReceived(self, data):
"""As soon as any data is received, write it back."""
if self.transport.checked and not self.pubkeyStored:
self.pubkeyStored = True
x509 = m2.ssl_get_peer_cert(self.transport.ssl._ptr())
if x509 is not None:
x509 = X509.X509(x509, 1)
pk = x509.get_pubkey()
self.pubkey = pk.get_rsa().as_pem()
print pk.as_pem(None)
print self.pubkey
self.transport.write(data)
Wie Sie sehen können, verwendet einige interne Klassen, die würde ich gerne verhindern. Ich bin zu zögern Absenden ein kleines patch, das würde noch ein getCert
Methode, um die TLSProtocolWrapper
Klasse in M2Crypto.SSL.TwistedProtocolWrapper. Auch wenn es upstream akzeptiert, es würde die Kompatibilität von mein Skript mit alle, aber die meisten cut-of-the-edge-Versionen von m2crypto. Was würden Sie tun?
Externe OpenSSL-Aufruf von mir
Nun, es ist ein hässlicher workaround, basierend auf dem externen system-Befehle nur, die scheint mir sogar noch schlimmer als der Zugriff auf nicht-öffentliche Attribute.
InformationsquelleAutor sumpfomat | 2012-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige der vorherigen Antworten produzieren (scheinbar?) arbeiten PEM-public-key-Dateien, aber so weit ich habe versucht, keiner von Ihnen produzieren die gleiche Ausgabe wie das " openssl rsa -pubout -in priv.- Taste' funktioniert. Dies ist ziemlich wichtig für meine test-suite, und nach stochern im (0.15.1) PyOpenSSL-code, die funktioniert gut für sowohl standard-als PKey Objekte und der public-key-nur PKey-Objekte erstellt, indem der x509.get_pubkey () - Methode:
Funktioniert wie ein Charme!
InformationsquelleAutor Jessica Gadling
Analog
openssl rsa -in client.key -pubout > client.pub
Befehl inM2Crypto
(eine komplette openssl wrapper als pyOpenSSL):Können Sie
M2Crypto
stattpyOpenSSL
mit verdreht. Zum hinzufügen von ssl-Funktionen auf den echo-server:Können Sie:
Versuchen Sie es, erstellen Sie das selbst-signierte Zertifikate:
und die Verbindung zum server:
Speichert der server dem client den öffentlichen Schlüssel, um die
client.pub
- Datei. Es ist identisch mit der erstellt vonopenssl
Befehl:InformationsquelleAutor jfs
Einer Möglichkeit, den öffentlichen Schlüssel ist ein hässlicher workaround von Rohrleitungen der pem-version des x509-Zertifikats durch eine extern aufgerufene openssl Beispiel:
InformationsquelleAutor sumpfomat
Ich gemacht, es funktioniert endlich mit pyOpenSSL und DerSequence Klasse von Crypto.Util.asn1 (pyasn1-Bibliothek).
Hier ist eine Methode aus meinem RSAKey Klasse (pkey ist ein OpenSSL.crypto.PKey-Instanz) :
Der Schlüssel hier ist, das erste Element in pub_der._seq ist null, und wir brauchen es.
Als Sie umwandeln kann RSA-Schlüssel gespeichert ist in sich selbst.der Schlüssel zu jedem format, das Sie wünschen:
Ich arbeite derzeit mit CSpace Projekt, setzt es ein "ncrypt" Bibliothek ( das ist eine andere OpenSSL wrapper), welches nicht mehr unterstützt und es gibt segmentation Fault unter Linux. So entschied ich mich zu ersetzen, ncrypt Bibliothek mit pyOpenSSL, weil ich es mit in mein Projekt genannt DataHaven.NET. Und immer einen öffentlichen Schlüssel aus der peer-Zertifikat in PEM-format war wirklich ein problem für mich. Jetzt ist es gut funktioniert.
InformationsquelleAutor Veselin Penev