2013-06-17 19 views
8

Ich habe gerade ein Python-Programm getestet, das die Anmeldung bei einer Site erfordert und die Einrichtung eines CSRF-Cookies erfordert. Ich habe versucht, es als eine exe mit py2exe zu packen und bekam einen Socket-Fehler. Ich habe das gleiche Problem, wenn ich mit PyInstaller versuche. Bei der Suche nach dem Errno habe ich ein paar andere Leute mit dem gleichen Problem gefunden und daher weiß ich, dass das Problem mit dem Standort von SLL-Zertifikaten zu tun hat.Behebung eines SSL-Zertifikatsfehlers in exe, kompiliert mit py2exe (oder PyInstaller)

Dies ist meine site_agent Klasse einschließlich der Protokollierungsaufrufe.

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) 

Der Fehler kommt an der self.agent.get(URL) Linie und die Traceback zeigt:

Traceback (most recent call last): 
    File "<string>", line 223, in <module> 
    File "<string>", line 198, in main 
    File "<string>", 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 

Bedeutet dies, dass das Problem in requests.adapters ist?

Wenn ja, kann ich es nur in meinen installierten Python-Paketen bearbeiten, um woanders nach cacert.pem zu suchen, meine exe mit py2exe oder PyInstaller neu erstellen und dann wieder in meiner installierten Version von Python ändern?

EDIT

ich das Programm läuft mit jetzt haben PyInstaller nach dem Kompilieren und verify=False in allen requests.get() und requests.post() Gespräche einstellen. Aber SSL gibt es aus einem bestimmten Grund, und ich möchte diesen Fehler wirklich beheben können, bevor jemand das Tool verwenden darf.

+2

http://StackOverflow.com/a/21206079/538284 –

Antwort

4

Wenn pyinstaller mit ... eine hook-requests.py Datei in PyInstaller\hooks\ für die Anforderungen erstellen lib

enthält
from hookutils import collect_data_files 

# Get the cacert.pem 
datas = collect_data_files('requests') 
+1

pyinstaller enthält diesen Haken standardmäßig – gdw2

3

Neben der von frmdstryr gegebene Antwort hatte ich requests zu sagen, wo die cacert.pem ist. Ich fügte hinzu, die folgenden Zeilen direkt nach meinen Importen:

# 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') 

Diese Lösung von dieser Verbindung abgeleitet ist: http://kittyandbear.net/python/pyinstaller-request-sslerror-manual-cacert-solution.txt

1

Diese können leicht gelöst werden, wenn Sie „Anfragen“ Modul verwenden.

1) Platzieren Sie den Code unten in der Haupt Python-Datei, in „Anfragen“ Modul

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

2) Innerhalb Ihres ausschüttbaren Ordner, in dem exe vorhanden ist, erstellen Sie einen Ordner „Zertifi“ genannt und stellen die "cacert.pem" Datei darin.

3) Sie können die „cacert.pem“ Datei finden, indem

pip install certifi 

import certifi 
certifi.where() 

Ehrfürchtig .. jetzt Ihre verteilbare enthält die erforderlichen Zertifikate ssl Anrufe zu validieren.