将.py编译为.exe后验证ssl证书失败

问题描述:

我有一个读取URL的脚本。如果我使用python app.py将它运行到cmd,它工作正常。但是,编译它使用py2exe和运行.exe后,我收到此错误将.py编译为.exe后验证ssl证书失败

entering main now..... 
Traceback (most recent call last): 
    File "strtojson.py", line 257, in <module> 
    File "strtojson.py", line 209, in main 
    File "requests\api.pyc", line 70, in get 
    File "requests\api.pyc", line 56, in request 
    File "requests\sessions.pyc", line 475, in request 
    File "requests\sessions.pyc", line 596, in send 
    File "requests\adapters.pyc", line 497, in send 
requests.exceptions.SSLError: [Errno 2] No such file or directory 

这里是我访问该网站。

url = 'https://www.sec.gov/cgi-bin/browse-edgar?company=&CIK=&type=8-k&owner=include&count=100&action=getcurrent' 
response = requests.get(url) 
html = response.content 
soup = BeautifulSoup(html, "html.parser") 

这里是我的setup.py

from distutils.core import setup 
import py2exe 
setup(console=['strtojson.py'], options = {'py2exe' : {'packages': ['bs4', 'requests']}}) 

林在Win 7 64位使用Python 2.7.12

我的猜测是,Python会找不到信任的CA(验证服务器所需证书),因为它们不包含在exe中。在这种情况下使用requests.getverify=False应该工作。

但是,这应该只是为了验证这确实是问题的原因。然后更好的解决方法是将必要的可信CA放入一个文件中,然后将该文件与exe一起发送,然后使用verify='trusted-ca.pem'。您可以在https://curl.haxx.se/docs/caextract.html获得广泛使用的可信CA的集合。

虽然它会很高兴requests使用一些字符串作为受信任的CA我不认为这是支持的。您当然可以在可执行文件中包含受信任的CA,然后在调用requests.get(..., verify='temporary-ca-file.pem')之前从中创建一个临时文件。

+0

谢谢你的建议。其实我切换到urrlib2并没有给我这个错误。 @Steffen – essramos

+0

@wasp:就我所知,urllib2默认没有证书验证。而不是验证意味着没有错误,但它当然意味着这是不安全的。 –