使用 Python 检测 SSL 哈希算法

Detect SSL hash algorithm with Python

现在 SHA-1 明年将被主要浏览器禁止,我想检测哪些网站仍在使用它。有没有办法使用 Python(例如 Python's ssl library)获取此信息?我可以使用 openssl s_client 但我更喜欢 Pythonic 解决方案(与我的异步框架兼容)。

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

我翻阅了 ssl 文档,但找不到哈希算法参考。而且我不知道如何从 ssl 上下文中获取此信息。 TIA!

签名哈希算法不是 SSL 连接的 属性,而是证书的 属性。获得证书后,您可以使用 get_signature_algorithm 从 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'

使用 Python3 也可以使用密码学包中的 signature_hash_algorithm

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'