使用Python获取SMTP服务器证书
连接一个支持STARTTLS的SMTP服务器并获取它的SSL证书,最简单的方法是什么?我知道可以用openssl来做到这一点,像这样:
openssl s_client -starttls smtp -crlf -connect 192.168.0.1:25
我想知道如何在Python中做到这一点,而且我不想调用openssl并解析它的输出。我看过M2Crypto,这是一个openssl的封装库,但我发现它似乎不支持starttls。如果能给我一个用Python库实现的例子,那就太好了。
3 个回答
0
因为我不能对这个回答进行评论,所以我想说的是,根据服务器的配置,你可能需要在启动加密(STARTTLS)之前先发送一个EHLO命令:
import socket, ssl
hostname = 'test.com'
port = 25
context = ssl.create_default_context()
with socket.create_connection((hostname, port)) as sock:
sock.recv(1000)
sock.send(b'EHLO\nSTARTTLS\n')
sock.recv(1000)
with context.wrap_socket(sock, server_hostname=hostname) as sslsock:
der_cert = sslsock.getpeercert(True)
0
你可以试试下面这样的代码:
import ssl
cert = ssl.get_server_certificate(('imap.gmail.com',993))
这样可以获取服务器的证书。
1
这段代码会返回一个以二进制格式(DER编码)表示的证书:
import socket, ssl
s = socket.socket()
s.connect(("host", 25))
s.send("STARTTLS\n")
s.recv(1000)
ss = ssl.wrap_socket(s)
certificate_der = ss.getpeercert(True)
这只是给你一个大概念,当然你还需要处理错误等问题。如果你想从证书中解码信息,你要么需要提供一个证书颁发机构的包或目录,以便接受的CA(在这种情况下,getpeercert()会返回一个有意义的字典),要么可以使用更强大的SSL库,比如M2Crypto。