我收到来自 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同时使用requests和http.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 的一些问题,并在构建环境中成功测试。构建环境现在正确匹配开发环境!