使用Python请求进行HTTPS TSL证书链验证
我正在使用python 2.7.9运行windows服务。 作为其中的一部分,我正在尝试使用HTTPS连接到服务器。 我使用请求模型(2.7.0)来实现这一点。 我还使用wincertstore(0.2)模型来读取windows证书存储并将其用作CA。 服务器证书按以下顺序使用中间证书签名- 根是“根证书颁发机构-G2” 中间版本是“Go-Daddy安全证书颁发机构-G2” 服务器证书“*.demoserver.com” 我的问题是证书验证失败并出现以下错误-SSLError:[SSL:certificate\u VERIFY\u FAILED]certificate VERIFY FAILED(\u SSL.c:581) 以下是我正在使用的代码:使用Python请求进行HTTPS TSL证书链验证,python,security,ssl,https,python-requests,Python,Security,Ssl,Https,Python Requests,我正在使用python 2.7.9运行windows服务。 作为其中的一部分,我正在尝试使用HTTPS连接到服务器。 我使用请求模型(2.7.0)来实现这一点。 我还使用wincertstore(0.2)模型来读取windows证书存储并将其用作CA。 服务器证书按以下顺序使用中间证书签名- 根是“根证书颁发机构-G2” 中间版本是“Go-Daddy安全证书颁发机构-G2” 服务器证书“*.demoserver.com” 我的问题是证书验证失败并出现以下错误-SSLError:[SSL:cert
import requests
import wincertstore
ca = wincertstore.CertFile()
ca.addcerts('ROOT')
ca.addcerts('CA')
requests.get('https://server.demoserver.com', verify=ca.name)
如果我在Chrome\Firefox\IE上打开它,验证就成功了。
我确实注意到了以下行为:
在新的操作系统上,如果我第一次使用浏览器打开服务器,中间证书(“Go Daddy Secure certificate Authority-G2”)将添加到Windows证书存储中,在该用户下,在中间证书颁发机构下。
如果这样,我将从python控制台运行上述代码,验证将起作用,因为证书已添加到windows应用商店。
但是,由于我的代码是作为服务运行的,这意味着使用系统用户和本地计算机存储,证书将不在那里,验证将失败
我的问题是如何让它工作?我如何告诉python检查整个链,我认为它检查服务器证书,只看到一级证书(中间证书),无法识别它并失败,即使根证书也在系统存储中找到
我还尝试使用certifi作为CA,但也失败了建议“CA.addcerts(…)”应该是“CA.addstore(…)”,来自: