2013-06-17 1 views
8

Я только что закончил тестирование программы Python, которая включает в себя вход в сайт и требует, чтобы был установлен CSRF-файл cookie. Я попытался упаковать его как exe, используя py2exe и получил ошибку сокета. У меня такая же проблема, когда я пытаюсь использовать PyInstaller. Googling the Errno Я нашел несколько других людей с одинаковой проблемой, поэтому я знаю, что проблема связана с расположением сертификатов SLL.Исправление ошибки сертификата SSL в exe, скомпилированном с py2exe (или PyInstaller)

Это мой класс site_agent, включая вызовы регистрации.

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) 

ошибка приходит на self.agent.get(URL) линии и Traceback показывает:

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 

Означает ли это, что проблема заключается в requests.adapters?

Если да, то я могу просто изменить его в моих установленных пакетах Python искать cacert.pem где-то еще, восстановить мой ех с py2exe или PyInstaller, а затем изменить его обратно в моей установленной версии Python?

EDIT

теперь у меня есть ход программы после компиляции с PyInstaller и установкой verify=False во всех requests.get() и requests.post() вызовов. Но SSL существует по какой-то причине, и мне очень хотелось бы исправить эту ошибку, прежде чем позволить кому-либо использовать этот инструмент.

+2

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

ответ

4

При использовании pyinstaller ... создать hook-requests.py файл в PyInstaller\hooks\ для запросов Lib, содержащий

from hookutils import collect_data_files 

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

pyinstaller теперь включает этот крючок по умолчанию – gdw2

3

В дополнение к ответу на данный frmdstryr, я должен был сказать requests где cacert.pem есть. Я добавил следующие строки сразу после моего импорта:

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

Это решение является производным от этой ссылке: http://kittyandbear.net/python/pyinstaller-request-sslerror-manual-cacert-solution.txt

1

Это может быть легко решена, если вы используете «запросы» модуля.

1) Поместите следующий код в основном файле питон, где «запросы» модуль используются

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

2) В вашей распределяемой папке, где ех присутствует, создайте папку с именем «certifi» и местом Файл "cacert.pem" внутри него.

3) Вы можете найти файл «cacert.pem» по

pip install certifi 

import certifi 
certifi.where() 

Потрясающие .. теперь ваш распространяемый включает необходимые сертификаты для проверки SSL-вызовов.

Смежные вопросы