2016-11-20 1 views
1

Maintenant que SHA-1 sera banni l'année prochaine par les principaux navigateurs, je veux détecter les sites qui l'utilisent encore. Y at-il un moyen d'obtenir cette information en utilisant Python (comme Python's ssl library)? Je peux utiliser openssl s_client mais je préférerais une solution Pythonic (compatible avec mon framework asynchrone).Détecter l'algorithme de hachage SSL avec Python

exemple s_client:

$ 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 

Je fouilla dans la documentation ssl, mais n'a pas pu trouver hachage algo références. Et je ne sais pas comment obtenir cette information du contexte SSL. TIA!

Répondre

3

L'algorithme de hachage de signature n'est pas une propriété de la connexion SSL mais une propriété du certificat. Une fois que vous avez le certificat, vous pouvez obtenir l'algorithme en utilisant get_signature_algorithm de OpenSSL.crypto:

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' 

Avec un python3 peut également utiliser signature_hash_algorithm du package de cryptographie:

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'