我需要编写一个脚本,该脚本通过HTTPS连接到公司内部网络上的许多站点,并验证其SSL证书是否有效;它们尚未过期,是否为正确的地址颁发等等。我们对这些站点使用我们自己的内部公司证书颁发机构,因此我们拥有CA的公钥来验证证书。
默认情况下,Python在使用HTTPS时仅接受并使用SSL证书,因此即使证书无效,诸如urllib2和Twisted之类的Python库也将很乐意使用该证书。
是否有一个好的库可以让我通过HTTPS连接到站点并以这种方式验证其证书?
如何在Python中验证证书?
从版本2.7.9 / 3.4.3开始,Python 默认情况下会 尝试执行证书验证。
这在PEP 467中已提出,值得一读:https :
//www.python.org/dev/peps/pep-0476/
所做的更改会影响所有相关的stdlib模块(urllib / urllib2,http,httplib)。
相关文件:
https://docs.python.org/2/library/httplib.html" target="_blank">html#httplib.HTTPSConnection
现在,此类默认情况下执行所有必要的证书和主机名检查。要恢复为先前未验证的行为,可以将ssl._create_unverified_context()传递给context参数。
https://docs.python.org/3/library/http.client.html#http.client.HTTPSConnection
在版本3.4.3中更改:现在,此类在默认情况下执行所有必要的证书和主机名检查。要恢复为先前未验证的行为,可以将ssl._create_unverified_context()传递给context参数。
请注意,新的内置验证基于 系统提供的 证书数据库。与此相反,请求包附带了自己的证书捆绑包。PEP
476
的“ 信任数据库”
部分
讨论了这两种方法的优缺点。