使用Python请求进行HTTPS TSL证书链验证

时间:2015-10-01 14:36:45

标签: python security ssl https python-requests

我正在使用python 2.7.9运行Windows服务。 作为其中的一部分,我正在尝试使用HTTPS连接到服务器。 我正在使用请求模型(2.7.0)来完成它。 我也使用wincertstore(0.2)模型来读取Windows证书库并将其用作CA. 服务器证书使用中间证书按以下顺序烧录 -

Root是“Go Daddy Root Certificate Authority - G2”

中级是“Go Daddy Secure Certificate Authority - G2”

服务器证书“* .demoserver.com”

我的问题是证书验证失败并出现以下错误 - SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:581)。

以下是我正在使用的代码:

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安全证书颁发机构 - G2”)将被添加到Windows证书存储区,在该用户下,在中级证书颁发机构下。 如果那时我将从python控制台运行上面的代码,验证将起作用,因为证书已添加到Windows应用商店。 但是,由于我的代码是作为服务运行的,这意味着使用SYSTEM用户和本地机器商店,证书将不存在,验证将失败。

我的问题是如何让它发挥作用?我如何告诉python检查整个链,我认为它检查服务器证书,只看到一级(中间证书),不识别它并失败,即使在系统存储中也找到了根证书

我也尝试使用certifi作为CA也失败了

0 个答案:

没有答案
相关问题