【发布时间】:2018-06-26 09:27:09
【问题描述】:
是否可以使用 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-----
我很确定这是可能的,因为我可以从我的网络浏览器下载它。有什么想法吗?
(我已经检查过Getting certificate chain with Python 3.3 SSL module,但我不确定这是我想要的……)
编辑:我在 Patrick Mevzek 回答后尝试了什么:
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 是无。我认为这是因为我在使用 OpenSSL 时遗漏了一些东西。
【问题讨论】:
-
“但 cert_str 为无。”请参阅我更新的答案中的备注。根据观察,尝试仅在 在 TLS 流中交换了一些数据之后才调用它,因为在此之前它没有正确填充。 PS:请不要在问题/文档中使用
1.2.3.4作为占位符,请参阅RFC5737中的指导以混淆IP地址,因此您可以使用192.0.2.x -
感谢您的回答和建议,我会记住的!