我需要扫描IP列表并从该IP上的证书中检索公用名(对于每个允许端口443连接的IP)。我已经能够使用套接字和ssl模块成功地做到这一点。它适用于具有有效签名证书的所有IP,但不适用于自签名证书。
如果使用此方法,则需要由我的CA捆绑包验证的有效证书:
from socket import socket
import ssl
s = socket()
c = ssl.wrap_socket(s,cert_reqs=ssl.CERT_REQUIRED, ca_certs='ca-bundle.crt')
c.connect(('127.0.0.1', 443))
print c.getpeercert()
如果我删除cert_reqs=ssl.CERT_REQUIRED
,那么它将连接,但根本不获取证书。
如何检索IP上证书的公用名,无论它是否根据ca捆绑包进行验证?
使用SNI支持检索和解析,解析日期并显示扩展数据(如
subjectAltName
):输出:
在Mac上你需要安装swig和m2cypto
在终端运行时:
然后:
然后可以运行上面的代码:
python ssl库似乎只在证书具有有效签名时为您解析它。
您仍然可以使用
ssl.get_server_certificate()
函数获取服务器证书,但它以PEM格式返回。(或者,您可以调用c.getpeercert(True)
,它以二进制顺序格式返回证书,无论证书是否经过验证。)从这里开始,我将使用m2cypto或OpenSSL读取证书并获取值:
相关问题 更多 >
编程相关推荐