2016-11-20 5 views
1

Nun, da SHA-1 im nächsten Jahr von den wichtigsten Browsern verboten wird, möchte ich erkennen, welche Websites es immer noch verwenden. Gibt es eine Möglichkeit, diese Informationen mit Python (z. B. Python's ssl library) zu erhalten? Ich kann openssl s_client verwenden, aber ich würde eine Pythonic-Lösung bevorzugen (die mit meinem asynchronen Framework kompatibel ist).Detect SSL-Hash-Algorithmus mit Python

s_client Beispiel:

$ openssl s_client -connect winkel.vpro.nl:443 < /dev/null 2>/dev/null | openssl x509 -text -in /dev/stdin | grep -i sha 
Signature Algorithm: sha1WithRSAEncryption 

ich durch die ssl docs gegraben, konnte aber nicht Hash algo Referenzen. Und ich weiß nicht, wie ich diese Informationen aus dem SSL-Kontext bekomme. TIA!

Antwort

3

Der Signatur-Hash-Algorithmus ist keine Eigenschaft der SSL-Verbindung, sondern eine Eigenschaft des Zertifikats. Sobald Sie das Zertifikat haben, können Sie den Algorithmus get_signature_algorithm von OpenSSL.crypto erhalten:

import ssl, socket, OpenSSL 

# connect to server and get certificate as binary (DER) 
sock = socket.socket() 
sock.connect(('www.google.com',443)) 
sslsock = ssl.wrap_socket(sock) 
cert_der = sslsock.getpeercert(True) 

# load binary certificate and get signature hash algorithm 
cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, cert_der) 
print cert.get_signature_algorithm() 
# -> 'sha256WithRSAEncryption' 

Mit Python3 man auch signature_hash_algorithm aus dem Kryptographie-Paket verwenden kann:

from cryptography import x509 
from cryptography.hazmat.backends import default_backend 

... get cert_der the same way as before ... 
cert = x509.load_der_x509_certificate(cert_der, default_backend()) 
print(cert.signature_hash_algorithm.name) 
# -> 'sha256'