Библиотека запросов: отсутствует файл сертификатов подтверждения SSL после cx_Freeze

Я создаю приложение на python 3.3, которое использует библиотеку запросов. Когда я пытаюсь получить URL-адрес с SSL-соединением, я хочу проверить его с помощью verify = true. Это отлично работает при запуске моих скриптов на Python.

Когда я замораживаю те же сценарии, он падает. Он что-то упускает, и я действительно не могу понять, как интегрировать его в свое замороженное приложение.

Я получаю следующую ошибку (которая также вызывает другие ошибки, но я не публикую их здесь):

Traceback (most recent call last):
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 422, in urlopen
body=body, headers=headers)
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 274, in _make_request
conn.request(method, url, **httplib_request_kw)
File "C:\Python33-32\lib\http\client.py", line 1049, in request
self._send_request(method, url, body, headers)
File "C:\Python33-32\lib\http\client.py", line 1087, in _send_request
self.endheaders(body)
File "C:\Python33-32\lib\http\client.py", line 1045, in endheaders
self._send_output(message_body)
File "C:\Python33-32\lib\http\client.py", line 890, in _send_output
self.send(msg)
File "C:\Python33-32\lib\http\client.py", line 828, in send
self.connect()
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 105, in connect
ssl_version=self.ssl_version)
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\util.py", line 281, in ssl_wrap_socket
context.load_verify_locations(ca_certs)
FileNotFoundError: [Errno 2] No such file or directory 

Кажется, что ca_certs отсутствует. В библиотеке запросов есть файл с именем cacert.pem, но я не знаю, отсутствующий ли это файл и как его импортировать, поскольку он, похоже, не интегрирован в мой окончательный замороженный пакет.


person Ecno92    schedule 01.03.2013    source источник
comment
Модули, которым требуются отдельные файлы (например, ключевой файл здесь), как правило, имеют проблемы при зависании. Возможно, вам потребуется отредактировать код запроса.   -  person Thomas K    schedule 01.03.2013
comment
Конечно, это вариант, который, вероятно, будет работать, но было бы лучше, если бы файл был импортирован в пакет из папки модуля. Можно ли также принудительно импортировать этот конкретный файл во время процесса замораживания? В процессе установки доступны функции импорта, но я не знаю, как именно их использовать, так как официальная документация не очень ясна по этому поводу.   -  person Ecno92    schedule 04.03.2013


Ответы (3)


Глядя на источник запросов, кажется, что вы можете передать путь к файлу cacert.pem как verify=path вместо verify=True. Поэтому вам не нужно изменять запросы, чтобы он работал.

Вы можете передать путь к файлу для включения в параметр include-files параметров cx_Freeze (документы). Вы можете найти путь из запросов, поэтому что-то вроде этого должно работать в setup.py, который вы используете для его заморозки:

import requests.certs
build_exe_options = {"include_files":[(requests.certs.where(),'cacert.pem')]}

#...
person Thomas K    schedule 05.03.2013
comment
Большое спасибо. Это было решение после небольшого изменения. Описанный вами метод невозможен, поскольку CX_Freeze не примет такой абсолютный путь. Ключевым моментом является использование кортежа, в котором вы сначала указываете абсолютный путь в первой половине, а во второй половине — путь назначения. Таким образом, это сработало, установив для проверки значение True. Вот так: include_files:[(requests.certs.where(),'cacert.pem')] - person Ecno92; 05.03.2013
comment
Спасибо. Я обновил ответ, чтобы он был понятен всем, кто сталкивался с этим. - person Thomas K; 06.03.2013

Как сказал Thomas K, вам нужно включить a файл сертификатов ЦС, если вы включите проверку .

Однако я обнаружил, что по крайней мере для меня requests будет искать [INSTALL PATH]\library.zip\cacert.pem, что не удастся.

Я решил это, скопировав cacert.pem, как описано

import requests.certs
build_exe_options = {"include_files":[(requests.certs.where(),'cacert.pem')]}

#...

и указал его путь непосредственно при выполнении запроса:

requests.get(..., verify = '[INSTALL PATH]\cacert.pem')
person Arc    schedule 09.07.2014
comment
Да, и INSTALL PATH можно определить предложенным методом cx_freeze. найти файлы данных - person dh762; 02.03.2016

Вы также можете использовать переменную среды «REQUESTS_CA_BUNDLE» (как сказано http://docs.python-requests.org/en/latest/user/advanced/#ssl-cert-verification)

Это намного проще, чем исправлять все ваши запросы:

os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(os.getcwd(), "cacert.pem")
person broomrider    schedule 11.08.2014