2014-07-26 1 views
6

Je tente de créer un .py au format .exe. Dans .py l'application fonctionne très bien, mais après je construis dans .exe à l'aide py2exe je reçois cette erreur:Requests.exceptions.SSLError: Errno 185090050

Traceback (most recent call last): 
File "filename.py", line 210, in <module> 
File "requests\api.pyc", line 55, in get 
File "requests\api.pyc", line 44, in requests 
File "requests\sessions.pyc", line 461, in request 
File "requests\sessions.pyc", line 567, in send 
File "requests\adapters.pyc", line 399, in send 
requests.exceptions.SLLError: [Errno 185090050] _ssl.c:344: error: 0B084002:x509 certificate routines: X509_load_cert_crl_file:system lib 

Et la ligne 210 dans le fichier est-ce

r2 = requests.get('https://www.hitbox.tv/api/chat/servers', timeout=timeoutDefault) 

Le setup.py est cette :

from distutils.core import setup 
import py2exe 

setup(console=['filename.py']) 

Comment puis-je résoudre ce problème?

+0

Connexe: [Errno 185090050 _ssl.c: 343: erreur: 0B084002: routines de certificat x509: X509_load_cert_crl_file: lib système, après emballage à exe par PyInstaller] (http://stackoverflow.com/questions/23073709/errno-185090050 -ssl-c343-error0b084002x509-certificat-routinesx509-load-c). – jww

Répondre

5

Le module requests (ou en fait urllib3 ci-dessous) n'ouvre pas le fichier de certificats CA.

Si vous ne voulez pas vérifier le certificat du serveur, vous pouvez modifier l'appel à:

r2 = requests.get('https://www.hitbox.tv/api/chat/servers', 
        timeout=timeoutDefault, verify=False) 

Si vous vous souciez de certificats (et vous devriez), assurez-vous que le fichier CA certs est livré avec ton application. Selon la documentation requests:

You can also pass verify the path to a CA_BUNDLE file for private certs. You can also set the REQUESTS_CA_BUNDLE environment variable.

Requests can also ignore verifying the SSL certificate if you set verify to False.

Voir ici: http://docs.python-requests.org/en/latest/user/advanced/#ssl-cert-verification

+1

Merci! Mais j'ai résolu le problème en supprimant le s du http: D – Cosmin

+6

Habituellement une mauvaise idée ... – dopatraman

1

J'ai travaillé autour de ce singe par ragréage requests passer cacert.pem:

def _monkey_patch_requests(): 
    orig_send = HTTPAdapter.send 
    def _send_no_verify(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): 
     return orig_send(self, request, stream, timeout, 'cacert.pem' if verify else False, cert, proxies) 
    HTTPAdapter.send = _send_no_verify 

_monkey_patch_requests() 

et la copie <Python>/Lib/site-packages/certifi/cacert.pem à dist.

+0

Il n'est pas nécessaire de patcher le code. Vous pouvez passer le chemin d'accès au fichier cacert.pem comme valeur du paramètre verify: 'requests.get ('https://www.hitbox.tv/', verify = 'chemin/to/cacert.pem')' – nmgeek

+0

@nmgeek Si l'appel 'requests.get' est en code tiers, la correction de singe est plus facile. – valtron

+0

C'est juste _if_ demandes.get est appelé à partir de code tiers. Dans la question, c'est dans filename.py (sur la ligne 210) et cela semble faire partie du code d'application de CosminZoRR. – nmgeek