Как исправить ошибку проверки сертификата 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 и успешно протестирован в среде сборки. Создайте среду, теперь правильно соответствующую среде разработчика!

0 ответов

Другие вопросы по тегам