当前位置: 首页 > 后端技术 > Python

Python通过OpenSSL

时间:2023-03-26 19:19:46 Python

获取指定域名对应的SSL证书。同一台服务器也可以获取不同的虚拟主机域名证书,直接上传代码:defget_certificate(hostname,port):importidnafromsocketimportsocketfromOpenSSLimportSSLsock=socket()#sock.settimeout(10)#不要打开sock.setblocking(True)#键。.sock.connect((主机名,端口),)ctx=SSL.Context(SSL.SSLv23_METHOD)ctx.check_hostname=Falsectx.verify_mode=SSL.VERIFY_NONEsock_ssl=SSL.Connection(ctx,sock)sock_ssl.set_tlsext_host_name(idna.encode(hostname))#key:不同域名对应的证书sock_ssl.set_connect_state()sock_ssl.do_handshake()cert=sock_ssl.get_peer_certificate()sock_ssl.close()sock.close()returncertforuin['https://www.baidu.com/','https://mp.weixin.qq.com/','https://www.qq.com/']:fromurllibimportparsers=parse.urlparse(u)cert=get_certificate(rs.hostname,int(rs.portor443))print(u)print('\ttime:',cert.get_notBefore(),'~',cert.get_notAfter())请注意,如果设置超时(sock.settimeout(10))开启非阻塞模式,可能会出现如下错误(使用sock.setblocking(True)开启阻塞模式):Traceback(mostrecentcalllast):File"webcheck.py",line122,在maincert=get_certificate(rs.hostname,int(rs.portor443))文件“webcheck.py”中,行23、在get_certificate中sock_ssl.do_handshake()文件“/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/OpenSSL/SSL.py”,第1915行,do_handshakeself._raise_ssl_error(self._ssl,result)文件“/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/OpenSSL/SSL.py”,第1622行,在_raise_ssl_errorraiseWantReadError()WantReadError