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

Schreibe einen Kommentar