Доверяйте самоподписанному сертификату SSL / TLS для безопасной межсервисной связи - PullRequest
0 голосов
/ 18 апреля 2020

У нас есть оркестровка микросервисов, работающих на сервере. Сервис nginx действует как прокси между микросервисами. Мы хотели бы иметь все коммуникации по SSL с нашими самозаверяющими сертификатами.

Мы хотим добавить наш частный ЦС в каждую службу (запущенную на Debian Buster), чтобы она считалась действительной везде в этой службе. Мы генерируем наш сертификат сервера и CA следующим образом:

# Generate Root CA Certificate
openssl genrsa -des3 -out CA-key.pem 2048
openssl req -new -key CA-key.pem -x509 -days 1000 -out CA-cert.pem

# Generate a Signing a Server Certificate
openssl genrsa -des3 -out server-key.pem 2048
openssl req –new –config openssl.cnf –key server-key.pem –out signingReq.csr
openssl x509 -req -days 365 -in signingReq.csr -CA CA-cert.pem -CAkey CA-key.pem -CAcreateserial -out server-cert.pem

Однако мы не можем заставить микросервисы считать сертификат действительным и доверять ему. Когда в микросервисе выдается запрос на получение с использованием библиотеки запросов Python, выдается следующее исключение:

requests.exceptions.SSLError: HTTPSConnectionPool(host='server.name', port=443): Max 
retries exceeded with url: /url/to/microservice2/routed/via/nginx/ (Caused by 
SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate 
verify failed: self signed certificate (_ssl.c:1076)')))

То, что мы пробовали до сих пор:

  • Копирование сертификата в / usr / share / ca-certificate / и выполнение команд sudo dpkg-reconfigure ca-certificates и / или update-ca-certificates.
  • Установите для переменной REQUESTS_CA_BUNDLE env значение /path/to/internal-CA-cert.pem
  • Установите для переменной SSL_CERT_FILE env значение /path/to/internal-CA-cert.pem

Единственный работающий обходной путь - установка valid=False в requests.get(url, params=params, verify=False, **kwargs), чтобы игнорировать действительность сертификата SSL. Но это не тот мир, который мы хотели бы реализовать для всех микросервисов и коммуникаций.

1 Ответ

0 голосов
/ 28 апреля 2020

Решением было скопировать самоподписанный сертификат сервера (подписанный нашим собственным ЦС) в каталог /usr/local/share/ca-certificates и использовать update-ca-certificates, который поставляется в дистрибутивах Debian (аналогичное решение доступно для других дистрибутивов linux ).

cp /path/to/certificate/mycert.crt /usr/local/share/ca-certificates/mycert.crt
update-ca-certificates

Однако сложность заключается в том, что вышеуказанного решения недостаточно для того, чтобы библиотека запросов python могла считать сертификат действительным. Чтобы решить эту проблему, нужно добавить самоподписанный сертификат сервера к cat-certificates.crt и затем установить переменную среды REQUESTS_CA_BUNDLE для этого добавленного файла.

cat /path/to/certificate/mycert.crt >>/etc/ssl/certs/ca-certificates.crt
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...