您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Python中禁用SSL证书验证

5b51 2022/1/14 8:22:12 python 字数 2304 阅读 444 来源 www.jb51.cc/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()`
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='\x06\x03U\x04\x03' # 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

总结

以上是编程之家为你收集整理的在Python中禁用SSL证书验证全部内容,希望文章能够帮你解决在Python中禁用SSL证书验证所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶