浏览器可以通过编程方式无法获取远程服务器的根证书。为什么?

时间:2020-05-14 10:55:54

标签: python ssl ca

我正在尝试以编程方式检索公司网站的根CA证书。

我尝试了几件事,它们基本上都依赖于OpenSSL的get_peer_cert_chain()方法。

import sys
import socket
from OpenSSL import SSL


HOSTNAME = sys.argv[1]

context = SSL.Context(method=SSL.TLSv1_METHOD)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock = SSL.Connection(context=context, socket=sock)
sock.settimeout(5)
sock.connect((HOSTNAME, 443))
sock.setblocking(1)
sock.do_handshake()
for cert in sock.get_peer_cert_chain():
    print(f"subject: {cert.get_subject()}")
    print(f"issuer:  {cert.get_issuer()}")
sock.shutdown()
sock.close()

该方法在应返回两个证书时仅返回一个证书:根CA丢失。 我读过某个地方,如果服务器愿意,它可以省略根CA(这不是由协议强制执行的。)

但是Firefox和Internet Explorer能够“看到”根CA,并允许我将其复制到磁盘上的文件中。

为什么这些浏览器可以看到它们,为什么我的Python SSL连接看不到? 两者有什么区别? 远程服务器是否有可能更改其行为并为特定用户代理或其他内容返回根CA?

0 个答案:

没有答案