0

我收到来自 gitlab CI 构建的 SSL 证书验证错误,该构建在 Python 3.x 架构中使用 docker 中的 docker。所有 CI 构建映像都是基于 alpine linux 的。

我已经设置了一个使用 Pytest 的 CI Python 3.x 测试作业。Pytest 在一些测试中产生了一个 docker-compose 进程。可以在gitlab-ci 论坛帖子中找到架构的图像

从 gitlab-CI 测试作业中,我导出 REQUESTS_CA_BUNDLE 和 SSL_CERT_FILE 环境变量以引用自定义根 ca 文件。我必须设置这两个变量,因为tus-py-client同时使用requestshttp.client库来处理 http 请求。

docker-compose 服务,从 pytest 开始,封装了一个自定义的 ca 根证书。这是服务器。

自定义 ca 根证书也包含在运行 pytest 的 gitlab CI 构建作业使用的映像中。这是客户端。

我还尝试将 ca 根证书封装在自定义 docker:dind 图像中。在所有情况下,在构建映像时都会运行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 容器。这是由 docker-compose 进程触发的,从 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:无法获取本地颁发者证书。

我尝试在单独的 Ubuntu 16.04 裸机实例上启动 docker-compose 服务,并使用 update-ca-certificates 安装了根证书。然后,我openssl s_client -connect docker:1081 -CApath /etc/ssl/certs在将 *docker 127.0.0.1 添加到 /etc/hosts 后成功验证了它。所以服务器证书和根 ca 似乎没问题。

为什么在连接到docker:dind中运行的特定 docker-compose 服务时收到验证错误号 20 和 21 ?

更新 21/12/2018 已 修复。在 CI 测试作业的图像中,我将自定义 ca 证书放在/usr/local/share/ca-certificates中。以前我将证书放在/usr/local/share/ca-certificates/subfolder中,并且在运行 update-ca-certificates 后,它没有附加到/etc/ssl/certs/ca-certificates.crt包中。在此之后,我恢复到 .gitlab-ci.yml 中事实上的 docker:dind 图像,证书仍然被成功验证。所以不需要在 docker:dind 中安装 ca root cert。

在开发环境中做了一个干净的 git clone。我修复了 pip install 的 requirements.txt 的一些问题,并在构建环境中成功测试。构建环境现在正确匹配开发环境!

4

0 回答 0