作为最终用户,我如何让我的共享 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:
检索证书
- 导航到 Chrome
中的 GitLab Web 界面
- 单击地址左侧地址栏中的锁
- 单击 连接安全
- 点击证书有效
- 在打开的新 window 中,转到 详细信息 选项卡
- 单击 复制到文件... 并将证书文件保存在某处,例如在名为
server-name.crt
的文件中
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:
- 导航至 设置 → CI/CD 并展开 变量 部分。
- 单击添加变量
- 设置变量的Key为
GIT_SSL_CAINFO
(环境变量Git会查找)
- 将
server-name.crt
的内容粘贴到值字段中
- 将其类型从变量更改为文件
在作业期间,GitLab CI 现在将创建一个临时文件,将证书文本放入该文件,并将 GIT_SSL_CAINFO
环境变量设置为文件路径. Git会自动拾取。
这样做的好处是(可能)不需要更改任何代码。您现有的 GitLab CI 工作应该“正常工作”。这意味着您应该能够在组级别设置变量,以防您有多个受影响的项目。
选项 2:让容器中的操作系统信任它。
我将展示一种使用 Debian 或 Ubuntu-based 映像执行此操作的方法。 Alpine、Fedora 等图像可能需要一些调整。
如上面选项1第一部分所示创建一个文件变量,但给它一个不同的Key。我将在这里使用 TRUSTED_CERTS
。
更新您的 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 基础映像可以缓解这种情况。
我有一个项目有一个依赖项,它通过 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:
检索证书- 导航到 Chrome 中的 GitLab Web 界面
- 单击地址左侧地址栏中的锁
- 单击 连接安全
- 点击证书有效
- 在打开的新 window 中,转到 详细信息 选项卡
- 单击 复制到文件... 并将证书文件保存在某处,例如在名为
server-name.crt
的文件中
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:
- 导航至 设置 → CI/CD 并展开 变量 部分。
- 单击添加变量
- 设置变量的Key为
GIT_SSL_CAINFO
(环境变量Git会查找) - 将
server-name.crt
的内容粘贴到值字段中 - 将其类型从变量更改为文件
在作业期间,GitLab CI 现在将创建一个临时文件,将证书文本放入该文件,并将 GIT_SSL_CAINFO
环境变量设置为文件路径. Git会自动拾取。
这样做的好处是(可能)不需要更改任何代码。您现有的 GitLab CI 工作应该“正常工作”。这意味着您应该能够在组级别设置变量,以防您有多个受影响的项目。
选项 2:让容器中的操作系统信任它。
我将展示一种使用 Debian 或 Ubuntu-based 映像执行此操作的方法。 Alpine、Fedora 等图像可能需要一些调整。
如上面选项1第一部分所示创建一个文件变量,但给它一个不同的Key。我将在这里使用
TRUSTED_CERTS
。更新您的
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 基础映像可以缓解这种情况。