我正在编写一个脚本,它通过HTTPS连接到多个URL,下载其SSL证书并提取CN。一切正常,除了当我遇到一个无效的SSL证书时。我绝对不关心证书是否有效,我只想要CN,但是Python固执地拒绝提取未经验证的证书信息。有没有办法绕过这种非常愚蠢的行为?哦,我只使用内置的socket和ssl库,不想使用M2Crypto或pyOpenSSL等第三方库,因为我想让脚本尽可能地便携。
以下是相关代码:
file = open("list.txt", "r")
for x in file:
server = socket.getaddrinfo(x.rstrip(), "443")[0][4][0]
sslsocket = socket.socket()
sslsocket.connect((server, 443))
sslsocket = ssl.wrap_socket(sslsocket, cert_reqs=ssl.CERT_REQUIRED, ca_certs="cacerts.txt")
certificate = sslsocket.getpeercert()`
ssl.get_server_certificate()
在幕后使用了SSLSocket.getpeercert(True)
。https://docs.python.org/3/library/ssl.html#ssl.SSLSocket.getpeercert如果binary_form参数为True,并且提供了证书,则此方法将以字节序列的形式返回整个证书的DER编码形式,如果对等方未提供证书,则返回None。 - Jeremy Fishman