是否可以使用 ssl 和 Python 获取 PEM 格式的整个证书链?我可以通过以下方式获得具体的:
import ssl
addr = '192.0.2.1'
cert_str = ssl.get_server_certificate((addr, 443))
这给了我类似的东西:
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
但我想要:
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
我很确定这是可能的,因为我可以从我的网络浏览器下载它。任何想法 ?
(我已经查过使用Python 3.3 SSL模块获取证书链但我不确定这就是我想要的......)
EDIT:我尝试过之后帕特里克·梅夫泽克回答 :
from OpenSSL import SSL
import socket
dst = ('192.0.2.1', 443)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.set_alpn_protos([b'http/1.1'])
if sock.connect_ex(dst) == 0:
connection = SSL.Connection(ctx, sock)
cert_str = connection.get_peer_cert_chain()
但 cert_str 是 None 。我认为这是因为我在使用 OpenSSL 时遗漏了一些东西。