Corrección del error de certificado SSL en un exe comstackdo con py2exe (o PyInstaller)

Acabo de terminar de probar un progtwig Python que implica iniciar sesión en un sitio y requiere que se establezca una cookie CSRF. He intentado empaquetarlo como un archivo py2exe utilizando py2exe y obtuve un error de socket. Tengo el mismo problema cuando bash con PyInstaller . Buscando en Google Errno. Encontré a algunas otras personas con el mismo problema y sé que el problema está relacionado con la ubicación de los certificados SLL.

Esta es mi clase site_agent incluyendo las llamadas de registro.

  class site_agent: self.get_params() URL = root_url + '/accounts/login/' # Retrieve the CSRF token first self.agent = requests.session() self.agent.get(URL) # retrieves the cookie # This line throws the error self.csrftoken = self.agent.cookies['csrftoken'] # Set up login data including the CSRF cookie login_data = {'username': self.username, 'password': self.password, 'csrfmiddlewaretoken' : self.csrftoken} # Log in logging.info('Logging in') response = self.agent.post(URL, data=login_data, headers=hdr) 

El error se produce en la línea self.agent.get(URL) y el Traceback muestra:

 Traceback (most recent call last): File "", line 223, in  File "", line 198, in main File "", line 49, in __init__ File "C:\pyinstaller-2.0\pyinstaller-2.0\autoresponder\b uild\pyi.win32\autoresponder\out00-PYZ.pyz\requests.sessions", line 350, in get File "C:\pyinstaller-2.0\pyinstaller-2.0\autoresponder\b uild\pyi.win32\autoresponder\out00-PYZ.pyz\requests.sessions", line 338, in requ est File "C:\pyinstaller-2.0\pyinstaller-2.0\autoresponder\b uild\pyi.win32\autoresponder\out00-PYZ.pyz\requests.sessions", line 441, in send File "C:\pyinstaller-2.0\pyinstaller-2.0\autoresponder\b uild\pyi.win32\autoresponder\out00-PYZ.pyz\requests.adapters", line 331, in send requests.exceptions.SSLError: [Errno 185090050] _ssl.c:336: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib 

¿Significa esto que el problema está en requests.adapters ?

Si es así, ¿puedo editarlo en mis paquetes de Python instalados para buscar cacert.pem en otro lugar, reconstruir mi exe con py2exe o PyInstaller , y luego volver a cambiarlo en mi versión instalada de Python?

EDITAR

Ahora tengo el progtwig ejecutándose después de comstackr con PyInstaller y configurando PyInstaller verify=False en todas requests.get() llamadas requests.get() y requests.post() . Pero SSL está ahí por una razón y me gustaría poder corregir este error antes de permitir que alguien use la herramienta.

Si usa pyinstaller … cree un archivo PyInstaller\hooks\ en PyInstaller\hooks\ para las solicitudes que contiene lib

 from hookutils import collect_data_files # Get the cacert.pem datas = collect_data_files('requests') 

Además de la respuesta dada por frmdstryr , tuve que decirles dónde está cacert.pem . Agregué las siguientes líneas justo después de mis importaciones:

 # Get the base directory if getattr( sys , 'frozen' , None ): # keyword 'frozen' is for setting basedir while in onefile mode in pyinstaller basedir = sys._MEIPASS else: basedir = os.path.dirname( __file__ ) basedir = os.path.normpath( basedir ) # Locate the SSL certificate for requests os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(basedir , 'requests', 'cacert.pem') 

Esta solución se deriva de este enlace: http://kittyandbear.net/python/pyinstaller-request-sslerror-manual-cacert-solution.txt

Esto se puede resolver fácilmente si está utilizando el módulo “peticiones”.

1) Coloque el siguiente código en su archivo principal de python donde se usa el módulo de “solicitudes”

 os.environ['REQUESTS_CA_BUNDLE'] = "certifi/cacert.pem" 

2) Dentro de su carpeta distribuible donde exe está presente, cree una carpeta llamada “certifi” y coloque el archivo “cacert.pem” dentro de ella.

3) Usted puede encontrar el archivo “cacert.pem” por

 pip install certifi import certifi certifi.where() 

Impresionante … ahora su distribuible incluye los certificados necesarios para validar las llamadas ssl.