2013-06-17 12 views
8

Właśnie skończyłem testować program w języku Python, który wymaga logowania do witryny i wymaga ustawienia pliku cookie CSRF. Próbowałem pakować go jako exe przy użyciu py2exe i otrzymałem błąd gniazda. Mam ten sam problem, gdy próbuję z PyInstaller. Googling the Errno Znalazłem kilka osób z tym samym problemem, więc wiem, że problem dotyczy lokalizacji certyfikatów SLL.Naprawianie błędu certyfikatu SSL w exe skompilowanego z py2exe (lub PyInstaller)

To jest moja klasa site_agent, w tym połączenia rejestrowania.

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) 

Błąd pojawia się w linii self.agent.get(URL) a Traceback pokazuje:

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 

Czy oznacza to, że problem jest w requests.adapters? Jeśli tak, czy mogę po prostu edytować go w moich zainstalowanych pakietach Pythona, aby wyszukać cacert.pem gdzieś indziej, przebudować mój exe z py2exe lub PyInstaller, a następnie zmienić go z powrotem w mojej zainstalowanej wersji Pythona?

EDIT

Mam teraz uruchomiony program po kompilacji z PyInstaller i ustawienie verify=False we wszystkich requests.get() i requests.post() połączeń. Ale SSL istnieje z jakiegoś powodu i naprawdę chciałbym móc naprawić ten błąd, zanim pozwolę komuś korzystać z tego narzędzia.

+2

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

Odpowiedz

4

przypadku korzystania pyinstaller ... utworzyć plik w PyInstaller\hooks\ dla wniosków hook-requests.py lib zawierający

from hookutils import collect_data_files 

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

Aplikacja do usuwania puzzli domyślnie zawiera teraz ten hak – gdw2

3

Oprócz odpowiedzi udzielonej przez frmdstryr, musiałem powiedzieć requests gdzie cacert.pem jest. I dodaje następujące linie tuż po moich importu:

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

Rozwiązanie to pochodzi z tego linku: http://kittyandbear.net/python/pyinstaller-request-sslerror-manual-cacert-solution.txt

1

ten można łatwo rozwiązać, jeśli używasz „wnioski” moduł.

1) Umieść poniższy kod w pliku głównym Pythona gdzie moduł „wnioski” jest używane

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

2) W swojej podziałowi folderu gdzie exe jest obecny, utwórz folder o nazwie „certyfikowana” i umieść Plik "cacert.pem" w tym pliku.

3) Można znaleźć „cacert.pem” plik przez

pip install certifi 

import certifi 
certifi.where() 

Niesamowite .. teraz swoją dystrybuowana zawiera niezbędne certyfikaty do sprawdzania połączeń SSL.

Powiązane problemy