在Python中禁用SSL证书验证
发布时间:2020-05-23 10:56:26 所属栏目:Python 来源:互联网
导读:我正在编写一个脚本,通过HTTPS连接到一堆URL,下载他们的SSL证书并提取CN.一切都有效,除非我偶然发现一个SSL证书无效的网站.我绝对不在乎证书是否有效.我只想要CN,但如果证书未经过验证, Python就会顽固地拒绝提取证书信息.有没有办法绕过这种极其愚蠢的行为?
|
我正在编写一个脚本,通过HTTPS连接到一堆URL,下载他们的SSL证书并提取CN.一切都有效,除非我偶然发现一个SSL证书无效的网站.我绝对不在乎证书是否有效.我只想要CN,但如果证书未经过验证,Python就会顽固地拒绝提取证书信息.有没有办法绕过这种极其愚蠢的行为?哦,我只使用内置套接字和ssl库.我不想使用像M2Crypto或pyOpenSSL这样的第三方库,因为我试图让脚本尽可能地保持可移植性. 这是相关的代码: file = open("list.txt","r")
for x in file:
server = socket.getaddrinfo(x.rstrip(),"443")[0][4][0]
sslsocket = socket.socket()
sslsocket.connect((server,443))
sslsocket = ssl.wrap_socket(sslsocket,cert_reqs=ssl.CERT_REQUIRED,ca_certs="cacerts.txt")
certificate = sslsocket.getpeercert()`
解决方法ssl.get_server_certificate可以这样做:import ssl
ssl.get_server_certificate(("www.sefaz.ce.gov.br",443))
我认为函数doc字符串比python doc site更清晰: """Retrieve the certificate from the server at the specified address,and return it as a PEM-encoded string. If 'ca_certs' is specified,validate the server cert against it. If 'ssl_version' is specified,use it in the connection attempt.""" 因此,您可以从二进制DER证书中提取通用名称,以搜索通用名称对象标识符: def get_commonname(host,port=443):
oid='x06x03Ux04x03' # Object Identifier 2.5.4.3 (COMMON NAME)
pem=ssl.get_server_certificate((host,port))
der=ssl.PEM_cert_to_DER_cert(pem)
i=der.find(oid) # find first common name (certificate authority)
if i!=-1:
i=der.find(oid,i+1) # skip and find second common name
if i!=-1:
begin=i+len(oid)+2
end=begin+ord(der[begin-1])
return der[begin:end]
return None (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Python3的urllib.parse常用函数小结(urlencode,quote,quote
- Python运算符重载用法实例分析
- 在Django的上下文中设置变量的方法
- Python中使用ElementTree解析XML示例
- python – 将numpy.array中的每个元素与numpy.array中的每个
- python – Scrapy解析javascript
- 如何通过python使用sqlite3获取表名?
- python – Qt TextLineEdit:检索字符串而不是QString
- JavaScript高级程序设计 读书笔记之十 本地对象Date日期
- Python实现将SQLite中的数据直接输出为CVS的方法示例
