Curl работает, но запрос python завершается с ошибкой SSLError

#python-3.x #ssl #python-requests

#python-3.x #ssl #python-запросы

Вопрос:

Следующий curl cmd работает как есть, без каких-либо проблем,
curl -H "Authorization: Bearer $AUTH" --cacert "/var/lib/myapp/server-ca.crt" https://myapp.common:2567/service -X GET

Реализация этого в python,

 headers = {"Authorization": "Bearer {}".format(os.getenv("AUTH"))}
cacert = "/var/lib/myapp/server-ca.crt"
url = "https://myapp.common:2567/service"
response = requests.get(url=url, headers=headers, verify=cacert)
 

Однако он завершается ошибкой со следующей ошибкой

 HTTPSConnectionPool(host='myapp.common', port=2567): Max retries exceeded with url: /service
 (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),))
 

Для контекста cacert здесь содержит следующую информацию:
—НАЧАТЬ CERTIFCATE —- SOMERANDOMSTRING — КОНЕЦ СЕРТИФИКАТА—-

Комментарии:

1. Короче говоря: неправильный вариант. Вам нужно использовать verify not cert .

2. @SteffenUllrich Спасибо, что указали на это. Однако после изменения сертификата на verify у меня все та же проблема

3. «Однако после изменения сертификата на проверку» — первопричина устранена. С измененным кодом это другой вопрос. Пожалуйста, укажите именно тот (новый) код, который вы используете, и именно то (новое) сообщение об ошибке, которое вы получили в новом вопросе.

4. @SteffenUllrich Как указано в предыдущем комментарии, я получаю точно такую же ошибку. Новый код должен был использоваться requests.get(url=url, headers=headers, verify=cacert) . Я не думаю, что требуется новый вопрос, учитывая, что я сталкиваюсь с той же ошибкой

5. Я вновь открыл вопрос, но сомневаюсь, что его можно решить с помощью информации. verify=cacert именно так и должно работать. Если ваш файл искажен или не содержит сертификата CA, он также не должен работать с curl. Поэтому, пожалуйста, проверьте еще раз, что показанная команда curl и код Python и сообщения об ошибках действительно точно соответствуют тому, что вы делаете.

Ответ №1:

Оказывается, проблема была с сертификатом. У меня были самозаверяющие сертификаты, которых не было в хранилище доверия ОС.

Для запросов Python требуется путь к полному сертификату цепочки, а не только промежуточный сертификат для verify параметра. См. Документацию по запросам: проверка сертификата SSL

После его обновления он работал без каких-либо проблем.