Как исправить ошибку проверки сертификата SSL для сборки Gitlab CI, которая использует docker в службе docker (dind) для архитектуры Python 3.x? - PullRequest
0 голосов
/ 20 декабря 2018

Я получаю сообщение об ошибке проверки сертификата SSL от сборки Cit 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 для ссылки на пользовательский корневой каталог.файл.Я должен установить обе переменные, поскольку tus-py-client использует обе библиотеки request и http.client для запросов http.

Сервис docker-compose, запущенный из pytest, инкапсулирует пользовательский корневой сертификат.Это сервер.

Пользовательский корневой сертификат также включен в образ, используемый заданием сборки CI gitlab, которое запускает pytest.Это клиент.

Я также пытался инкапсулировать корневой сертификат ca в пользовательский образ докера: dind image.Во всех случаях update-ca-Certificates запускался при построении образов.Из того, что я понимаю, я думаю, что контейнерные службы 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 bare metal с корневым сертификатом, установленным с помощью update-CA-сертификаты.Затем я выдал 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-сертификаты.crt после запуска update-ca-сертификаты.После этого я вернулся к фактическому докеру: dind image в .gitlab-ci.yml, и сертификаты все еще были успешно проверены.Так что нет необходимости устанавливать ca root cert в docker: dind.

Сделал чистый клон git в среде разработки.Я исправил некоторые проблемы с require.txt для установки pip и успешно протестирован в среде сборки.Создайте среду, теперь правильно соответствующую среде разработчика!

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