<分区> 分区>
我需要从一堆具有自签名证书的设备中读取颁发者 CN。有些错误导致发行人 CN 在应该是唯一的时候并不是唯一的,我希望确定哪些有这种情况。我找到了一个代码片段 here并稍微修改一下:
import ssl, socket
myhostname = 'some_host'
myctx = ssl.create_default_context()
myctx.check_hostname = False
myctx.verify_mode = ssl.CERT_NONE # ssl.CERT_OPTIONAL
s = myctx.wrap_socket(socket.socket(), server_hostname=myhostname)
s.connect((hostname, 443))
cert = s.getpeercert()
当 verify_mode 为 CERT_NONE 时,建立连接但丢弃证书;当 CERT_OPTIONAL 连接失败时,因为验证失败。
如何在不使用 openssl 的情况下连接到错误证书并从中读取详细信息?
这是一个一次性解决问题的脚本;我只需要输出 some_host 和 issuer CN。 Openssl 在此系统上不可用。
EDIT 1 按照 Patrick 的 PyOpenSSL 建议(也不在此系统上)this post表示 cert = s.getpeercert(binary_form=True) 返回 DER 格式的证书。
EDIT 2 重复还是不重复?最终我认为是的,它是一个副本,但不是指定的“副本”,因为我的系统上没有 Openssl。我相信它仍然有用。下面的工作解决方案使用来自多个 other 的信息posts一路上和其他几个人一起。简洁的一点是使用 ssl.get_server_certificate(感谢 Steffen,不需要 getpeercert;返回 pem 而不是 der),丑陋的一点是将证书存储到文件中,然后使用未记录的方法获取详细信息。它不使用 getpeercert 也不使用 openssl。
如果有更简洁的方法来处理收到的 pem 证书以阅读详细信息,我很想知道,但它对我来说已经足够好了。
