I am trying to freeze a python app that depends on requests, but I am getting the following error:
Traceback (most recent call last):File "c:\Python33\lib\site-packages\requests\packages\urllib3\util.py", line 630, in ssl_wrap_socketcontext.load_verify_locations(ca_certs)
FileNotFoundError: [Errno 2] No such file or directory
Looks like it is having trouble finding the ssl certificate with the executable. I found this which seems to be the same problem, but I am not able to figure out how they got it to work. The main problem seems to be that the certificate bundled by requests is not copied over to the compressed library. So it seems that I will have to force cx_freeze to bundle the certificates and then point to it from my script.
Starting with this simple script everything works fine:
import requests
r = requests.get("https://yourapihere.com")
print(r.json())
Then if I add the certificate file I stat getting errors:
import requests
r = requests.get("https://yourapihere.com", cert=requests.certs.where())
print(r.json())
-
Traceback (most recent call last):File "c:\Python33\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 480, in urlopenbody=body, headers=headers)File "c:\Python33\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 285, in _make_requestconn.request(method, url, **httplib_request_kw)File "c:\Python33\lib\http\client.py", line 1065, in requestself._send_request(method, url, body, headers)File "c:\Python33\lib\http\client.py", line 1103, in _send_requestself.endheaders(body)File "c:\Python33\lib\http\client.py", line 1061, in endheadersself._send_output(message_body)File "c:\Python33\lib\http\client.py", line 906, in _send_outputself.send(msg)File "c:\Python33\lib\http\client.py", line 844, in sendself.connect()File "c:\Python33\lib\site-packages\requests\packages\urllib3\connection.py", line 164, in connectssl_version=resolved_ssl_version)File "c:\Python33\lib\site-packages\requests\packages\urllib3\util.py", line 637, in ssl_wrap_socketcontext.load_cert_chain(certfile, keyfile)
ssl.SSLError: [SSL] PEM lib (_ssl.c:2155)During handling of the above exception, another exception occurred:Traceback (most recent call last):File "c:\Python33\lib\site-packages\requests\adapters.py", line 330, in sendtimeout=timeoutFile "c:\Python33\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 504, in urlopenraise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: [SSL] PEM lib (_ssl.c:2155)During handling of the above exception, another exception occurred:Traceback (most recent call last):File "example.py", line 10, in <module>r = requests.get("https://yourapihere.com", cert=requests.certs.where())File "c:\Python33\lib\site-packages\requests\api.py", line 55, in getreturn request('get', url, **kwargs)File "c:\Python33\lib\site-packages\requests\api.py", line 44, in requestreturn session.request(method=method, url=url, **kwargs)File "c:\Python33\lib\site-packages\requests\sessions.py", line 383, in requestresp = self.send(prep, **send_kwargs)File "c:\Python33\lib\site-packages\requests\sessions.py", line 486, in sendr = adapter.send(request, **kwargs)File "c:\Python33\lib\site-packages\requests\adapters.py", line 385, in sendraise SSLError(e)
requests.exceptions.SSLError: [SSL] PEM lib (_ssl.c:2155)
I guess I am using it correctly, but cant really figure out why it is not working. I guess that after fixing this I can continue and add the certificate to the cx_freeze bundle, something like:
example.py:
import os
import requestscert = os.path.join(os.path.dirname(requests.__file__),'cacert.pem')
r = requests.get("https://yourapihere.com", cert=cert)
print(r.json())
setup.py:
from cx_Freeze import setup, Executableimport requests.certs
build_exe_options = {"zip_includes":[(requests.certs.where(),'requests/cacert.pem')]}executables = [Executable('example.py')
]setup(executables=executables)
if someone could give me a tip it would be much appreciated.