2017-03-23 79 views
1

道歉很长的职位,但我真的想彻底...SSL失败使用python请求

我有一个专门的网站,作为桥梁,交换各种环保车型之间的数据从远程服务器运行并在不同类型的操作系统(Linux,MacOS和Windows)上运行。 基本上,每台服务器都可以将数据文件上传/下载到网站,然后使用另一台服务器上的不同型号进一步处理文件。

网站有一些基本的保护(IP过滤,密码和SSL使用LetsEncrypt证书)。所有远程服务器都可以通过我们创建的简单Web界面访问该站点并上载/下载数据。

现在我们试图用一个简单的python(2.7)守护进程(基于请求模块)自动化一些交换。守护进程监视某些文件夹并将内容上传到网站。

守护进程在所有远程服务器上都能正常工作,除了运行Windows 7 Enterprise 64bit的服务器。该服务器安装了Python 2.7.13,并包含以下软件包:DateTime(4.1.1),psutil(5.2.0),pytz(2016.10),请求(2.13.0),zope.interface(4.3.3)。

从这个服务器的SSL连接工作正常通过Web浏览器,但是程序总是返回:

raise SSLError(e, request=request) 
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661) 

下面是我们试过到目前为止:

  • 设置验证=假。这可以正常工作,但我们不能在我们的最终生产环境中使用它。
  • 从守护程序工作的其他服务器复制证书,并设置verify =(证书文件的名称)(不成功)
  • 设置'用户代理'与我们从网站上的Windows机器上获得的完全相同的字符串,当连接完成时使用网络浏览器(不成功)

我们应该关注的其他设置Windows服务器尝试解决问题?它可以是一个防火墙设置,以某种方式允许浏览器的SSL连接通过,但阻止python守护进程?

UPDATE
运行这是产生错误的代理级别替换所有SSL证书在Windows远程服务器的组织。
他们的IT人员通过将我们网站的URL添加到代理设置上的“传递”网站列表来解决我们的问题。

这工作,现在很好。然而,我想知道我们是否可以直接在Python中处理证书替换...

回答

1

请求不像您的浏览器那样使用您的Windows根CA存储。

来自文档: 默认情况下,请求捆绑了一组信任的根CA,它们源自Mozilla信任存储库。但是,这些仅针对每个请求版本更新一次。

可信CA的列表也可以通过REQUESTS_CA_BUNDLE环境变量指定。

你可以从字面上这样做:

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem 
r = requests.get(url, verify=cafile) 

或者你可以使用CERTIFI如果您的CA证书是由公共实体签订。

+0

感谢您的回复。我们已经尝试过这种方法(第二个重点),但没有成功。我编辑了我的问题以确保它被清除。 – user6357781

+0

你复制了哪个证书?您需要颁发证书颁发机构证书,而不是Web服务器证书。 – Artagel

+0

我们从守护进程工作的另一个Windows服务器复制了cacert.pem文件。从C:\ Python27 \ lib \ site-packages \ requests \ cacert.pem – user6357781