作为最终用户,我如何让我的共享 Docker 运行器信任内部签名的 SSL 证书?

As an end user, how can I get my shared Docker runner to trust an internally-signed SSL certificate?

我有一个项目有一个依赖项,它通过 HTTP 从自托管的 GitLab 服务器中提取,例如:

{
  "name": "Project",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "some-dependency": "git+http://user:token@server.tld/group/project.git"
  }
}

GitLab 服务器的 SSL 证书由连接到公司 Active Directory 基础结构的内部证书颁发机构签署。在域计算机上,Chrome 和 Microsoft Edge 通过策略自动信任它。

Git 不:

fatal: unable to access 'https://server.tld/group/project.git': server certificate verification failed.

在 Windows,我可以使用 Schannel SSL back-end 制作由内部 CA 签署的 Git 信任证书:

git config --global http.sslBackend schannel

由于 schannel SSL 后端仅在 Windows 上可用,这不是我在 Docker 运行程序中测试 运行 的选项 Git实验室CI.

如何在不完全禁用证书检查的情况下在 GitLab CI 上安装项目的依赖项?

编辑: 我没有我正在使用的共享运行器的管理员权限,所以我不能 install trusted SSL certs on them directly.

从可信来源检索证书副本

验证证书是否真实很重要。由于 Chrome 已经通过策略信任证书,我们可以安全地从 Chrome:

检索证书
  1. 导航到 Chrome
  2. 中的 GitLab Web 界面
  3. 单击地址左侧地址栏中的锁
  4. 单击 连接安全
  5. 点击证书有效
  6. 在打开的新 window 中,转到 详细信息 选项卡
  7. 单击 复制到文件... 并将证书文件保存在某处,例如在名为 server-name.crt
  8. 的文件中

server-cert.crt 应该包含类似

的内容
-----BEGIN CERTIFICATE-----
MIIJKoHjzstDxgmHL2j/LQ46PHAbnVYz/JlflAQl3AAjoy9VdtY1hkiG9otrEQmF
...
tMn95/0eWw3lqeduiv5ux982PpepGY3aozPyTzt/1P==
-----END CERTIFICATE-----

如果您更喜欢以其他方式检索证书,例如via the openssl CLI tool, make sure to check its fingerprint against a reliable source. You can view the downloaded certificate's fingerprint like so:

openssl x509 -in server-cert.crt -noout -fingerprint

如果您需要其他类型的指纹,您可以申请一个,例如通过添加像 -sha256.

这样的参数

使用容器中的证书

现在我们有了证书的副本,我们需要让 Git 在 CI 作业期间知道它。至少有两种选择。

选项 1:让 Git 直接信任它。

Git 为此 a setting:

http.sslCAInfo

File containing the certificates to verify the peer with when fetching or pushing over HTTPS. Can be overridden by the GIT_SSL_CAINFO environment variable.

添加a CI variable to the project:

  1. 导航至 设置CI/CD 并展开 变量 部分。
  2. 单击添加变量
  3. 设置变量的Key为GIT_SSL_CAINFO(环境变量Git会查找)
  4. server-name.crt 的内容粘贴到值字段中
  5. 将其类型从变量更改为文件

在作业期间,GitLab CI 现在将创建一个临时文件,将证书文本放入该文件,并将 GIT_SSL_CAINFO 环境变量设置为文件路径. Git会自动拾取。

这样做的好处是(可能)不需要更改任何代码。您现有的 GitLab CI 工作应该“正常工作”。这意味着您应该能够在组级别设置变量,以防您有多个受影响的项目。

选项 2:让容器中的操作系统信任它。

我将展示一种使用 Debian 或 Ubuntu-based 映像执行此操作的方法。 Alpine、Fedora 等图像可能需要一些调整。

  1. 如上面选项1第一部分所示创建一个文件变量,但给它一个不同的Key。我将在这里使用 TRUSTED_CERTS

  2. 更新您的 gitlab-ci.yml 以将证书提取到 OS-level 证书存储区。此处显示了一种方法:

    default:
      before_script:
        # Add certificates contained in $TRUSTED_CERTS to OS-level certificate store
        - >
          [ -f "$TRUSTED_CERTS" ] &&
            ln -s "$TRUSTED_CERTS" /usr/local/share/ca-certificates/trusted.crt &&
            update-ca-certificates
        - yarn install  # Installing dependencies should work now
    

    如果设置了 $TRUSTED_CERTS,则会在 /usr/local/share/ca-certificates/ 中创建指向该文件的符号链接,然后运行 ​​update-ca-certificates 更新 OS-level 证书存储。

此选项应使大多数工具信任证书,但会增加 CI 作业的一些额外复杂性。

由于必须修改gitlab-ci.yml 文件,因此也不能轻易在组级别实施。包含更新证书的自定义 Docker 基础映像可以缓解这种情况。