2016-08-29 2 views
0

Ich konnte keinen geeigneten Weg finden, um den Namen des Signaturalgorithmus zu erhalten, der für ein Zertifikat verwendet wird, das von einem SSLSocket empfangen wird. Ich bin mir bewusst, dass Sie die Bytes des Peer-Zertifikat mit SSLSocket.getpeercert(True) ziehen können, aber ich weiß nicht, was ich damit zu tun habe. PyOpenSSL scheint keine einfache Schnittstelle zu haben, um einen X509 aus seinem Byte-Inhalt zu laden.Wo Name des Signaturalgorithmus von SSLSocket erhalten?

Ich würde gerne diese Informationen wissen, da Zertifikate mit SHA1 keine Ablaufzeiten nach dem 1. Januar 2017 haben dürfen, und dies wird von Pythons SSLSocket.do_handshake() Implementierung nicht überprüft.

+1

Sie könnten stattdessen die Kryptografie-Bibliothek verwenden. Dieser bietet [signature_hash_algorithm] (https://cryptography.io/en/latest/x509/reference/#cryptography.x509.Certificate.signature_hash_algorithm). –

Antwort

0

Nachdem der sehr hilfreiche Kommentar mich in die richtige Richtung weist, können Sie das Modul cryptography verwenden, um das DER X509-Format zu laden, das die SSLSocket.getpeercert()-Funktion ausgibt. Von dieser Certificate Instanz können Sie auch auf viele andere Felder des Zertifikats zugreifen, z. B. die Ablaufzeit. Hier ist der Weg, den ich gerade mache:

import cryptography.x509 
import cryptography.hazmat.backends.openssl 
import ssl 
sock = ssl.SSLSocket() 

# Wrap a socket, connect, handshake, etc etc... 

cert = cryptography.x509.load_der_x509_certificate(
    sock.getpeercert(True), 
    cryptography.hazmat.backends.openssl.backend 
) 
print(cert.signature_hash_algorithm.name) # This prints "sha1". 
Verwandte Themen