Python запрашивает SSLError с внутренним CA - PullRequest
4 голосов
/ 28 мая 2019

У моей компании есть собственный внутренний центр сертификации для внутренних служб, и мне нужно получить доступ к подключаемому Ansible AWX [python], чтобы поговорить с одной из наших внутренних служб, которая использует сертификат, подписанный этим центром сертификации.В основном:

  1. AWX раскручивает контейнер awx_task с установленным /etc/pki/ca-trust/source/anchors, который содержит корневой сертификат CA.[перепроверено]
  2. update-ca-trust выполняется, объединяя сертификат CA в различные вещи, включая /etc/pki/tls/certs/ca-bundle.crt.[перепроверено]
  3. requests следует использовать этот комплект.В контейнере или на хосте нет переменных среды, связанных с CA, которые могли бы переопределить это.

Однако, когда я запускаю тестовый запуск Ansible play, который выполняется внутри awx_task Я получаю сообщение об ошибке:

reports.exceptions.SSLError: HTTPSConnectionPool (host = 'vault.example.com', port = 443): максимальное число повторов превышено с помощью url: / (вызвано SSLError (Ошибка SSLError (1, u '[SSL: CERTIFICATE_VERIFY_FAILED], проверка сертификата не удалась (_ssl.c: 618)'),))

На хост-компьютере я могу запустить

import requests
requests.get("https://vault.example.com")

и получаю 200 ответ, и если я strace процесс, я вижу, что он читает /etc/pki/tls/certs/ca-bundle.crt.Но изнутри awx_task я получаю те же requests.exceptions.SSLError, что и выше.К сожалению, Docker не позволяет мне запускать strace внутри контейнера, поэтому я не вижу, что он пытается прочитать.

Но если я изменю код на:

import requests
requests.get("https://vault.example.com", verify="/etc/pki/tls/certs/ca-bundle.crt")

, я получу200 ответ изнутри контейнера.

Что мне здесь не хватает?

1 Ответ

1 голос
/ 28 мая 2019

Проблема в том, что @Will отметил, что текущая версия Requests использует пакет Certifi, который полностью отделен от OpenSSL.Пакет PEM фактически живет где-то в вашем каталоге пакетов Python.

Без изменения вашего кода вы можете переопределить его с помощью переменной окружения:

REQUESTS_CA_BUNDLE=/etc/pki/tls/certs/ca-bundle.crt

Редакция: Это абсолютно нелепый способ обеспечить доверие CA.Если вы хотите сократить доверие вашей системы, уменьшите его на системном уровне.Мне надоело гоняться за случайными PEM-пакетами, разбросанными по деревьям исходных текстов [которые, вероятно, никогда не будут обновляться] только потому, что некоторые # devoops чокнутый думают, что он знает, как управлять системами лучше, чем реальные операции, и разветвлять их плохоидеи для ничего не подозревающих систем.

(ノ ಠ 益 ಠ) ノ 彡 ┻━┻

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...