从哪里获取 SSLSocket 的签名算法名称?

Where to get name of signature algorithm from SSLSocket?

我找不到合适的方法来获取用于 SSLSocket 接收的证书的签名算法的名称。我知道您可以使用 SSLSocket.getpeercert(True) 提取对等证书的字节,但我不知道如何处理它。 PyOpenSSL 似乎没有一个简单的接口来从它的字节内容加载 X509。

我想知道此信息,因为带有 SHA1 的证书不允许在 2017 年 1 月 1 日之后过期,并且 Python 的 SSLSocket.do_handshake() 实施不会对此进行检查。

在为我指明正确方向的非常有帮助的评论之后,您可以使用 cryptography 模块加载 SSLSocket.getpeercert() 函数输出的 DER X509 格式。从这个 Certificate 实例中,您还可以访问有关证书的许多其他字段,例如过期时间。这是我现在正在做的方式:

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".