Как исправить ошибку проверки сертификата SSL для сборки Gitlab CI, которая использует docker в службе docker (dind) для архитектуры Python 3.x?
Я получаю ошибку подтверждения сертификата SSL от сборки CI gitlab, которая использует docker в docker в архитектуре Python 3.x. Все образы сборки CI основаны на альпийском Linux.
Я настроил тестовое задание CI Python 3.x, которое использует Pytest. Pytest порождает процесс docker-compose в некоторых тестах. Образ архитектуры можно найти в сообщении на форуме gitlab-ci.
Из тестового задания gitlab-CI я экспортирую переменные среды REQUESTS_CA_BUNDLE и SSL_CERT_FILE для ссылки на пользовательский корневой файл ca. Я должен установить обе переменные, так как tus-py-client использует и запросы, и библиотеки http.client для запросов http.
Сервис docker-compose, запущенный из pytest, инкапсулирует пользовательский корневой сертификат. Это сервер.
Пользовательский корневой сертификат также включен в образ, используемый заданием сборки CI gitlab, которое запускает pytest. Это клиент.
Я также попытался инкапсулировать корневой сертификат CA в пользовательский образ докера:dind image. Во всех случаях update-ca-сертификаты запускались при построении образов. Из того, что я понимаю, я думаю, что контейнерные службы docker-compose будут запускаться из экземпляра docker-in-docker (dind).
Краткий обзор файла .gitlab-ci.yml приведен ниже.
image: <custom devops image encapulating root ca>
stages:
- test
variables:
DOCKER_DRIVER: overlay2
DOCKER_HOST: tcp://docker:2375
SHARED_PATH: ${CI_PROJECT_DIR}/fileserver
POSTGRES_DB: ${PG_DB}
POSTGRES_PASSWORD: ${PG_PASSWORD}
POSTGRES_USER: ${PG_USER}
DATABASE_URL: "postgres://${PG_USER}:${PG_PASSWORD}@postgres:5432/${PG_DB}"
services:
- name: <custom docker:dind image encapsulating ca root cert>
alias: docker
- name: <custom postgres image>
alias: postgres
before_script:
- <setup ssh key for cloning dependent repositories>
- <login to docker registry at registry.gitlab.com>
test:
stage: test
script:
- <clone and generate configuration for docker-compose project>
- pip install -r requirements.txt
- export REQUESTS_CA_BUNDLE=<ca root crt file>
- export SSL_CERT_FILE=<ca root crt file>
- pytest --cov=api --cov-report term-missing --cov-report html:coverage
Насколько я понимаю, корневой сертификат CA необходимо будет установить в хранилище сертификатов как клиента, так и сервера. В этом конкретном случае клиент - это тестовое задание CI, а сервер - контейнер nginx. Это вызвано процессом создания докера, порожденным изнутри pytest.
Образ архитектуры доступен в моем посте на форуме gitlab-ci.
Я получаю сбой исключения SSL-сертификата, ошибка ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] Не удалось проверить сертификат (_ssl.c:847)? Клиент подключается к серверу в экземпляре docker:dind, и процесс рукопожатия завершается с ошибкой. Есть идеи?
Обновить, если я выпускаю openssl s_client -connect docker:1081 -CApath /etc/ssl/certs
в тестовом задании сборки CI, чтобы попытаться проверить сертификат, я получаю ошибку проверки:num=21: невозможно проверить первый сертификат и проверить ошибку:num=20: невозможно получить сертификат локального эмитента.
Я попытался запустить сервисы docker-compose в отдельном экземпляре Ubuntu 16.04 с открытым железом с корневым сертификатом, установленным с использованием update-ca-Certificates. Я тогда выпустил openssl s_client -connect docker:1081 -CApath /etc/ssl/certs
которая успешно прошла проверку после добавления *docker 127.0.0.1 в /etc/hosts. Таким образом, сертификат сервера и root ca выглядят нормально.
Почему я получаю сообщения об ошибках проверки 20 и 21 при подключении к определенной службе docker-compose, работающей в docker:dind?
Обновление 21/12/2018 Исправлено. В образе для тестового задания CI я поместил пользовательский сертификат ca в /usr/local/share/ca-сертификаты. Ранее я помещал сертификат в /usr/local/share/ca-Certificates/ подпапку, и он не добавлялся в /etc/ssl/certs/ca-certificates.crt комплект после запуска update-ca-Certificates. После этого я вернулся к фактическому докеру:dind image в.gitlab-ci.yml, и сертификаты все еще были успешно проверены. Так что нет необходимости устанавливать CA root cert в докере:dind.
Сделал чистый клон git в среде разработки. Я исправил некоторые проблемы с require.txt для установки pip и успешно протестирован в среде сборки. Создайте среду, теперь правильно соответствующую среде разработчика!