Docker部署GitLab与Runner时x509证书验证失败问题咨询
解决GitLab Runner注册时x509证书IP SAN验证失败问题
首先,问题的核心很明确:你的自签名证书没有包含IP地址作为SAN(Subject Alternative Name)。浏览器访问时可能因为你手动忽略了证书警告,或是浏览器的验证逻辑相对宽松,但GitLab Runner基于Go语言的HTTP客户端对证书的SAN验证非常严格——当你用IP(192.168.1.46)访问GitLab时,证书里必须明确把这个IP列在SAN字段里,否则就会触发x509: cannot validate certificate for ... because it doesn't contain any IP SANs错误。
下面给你两种解决思路,优先推荐规范的证书修复方案,应急场景可以用禁用验证的方式:
方案一:重新生成包含IP SAN的自签名证书(推荐)
这是最安全合规的解决方式,步骤如下:
- 创建一个OpenSSL配置文件(比如命名为
openssl.cnf),添加IP SAN的配置项:[req] distinguished_name = req_distinguished_name x509_extensions = v3_req prompt = no [req_distinguished_name] CN = 192.168.1.46 # 填写你的GitLab访问IP [v3_req] keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] IP.1 = 192.168.1.46 # 明确指定GitLab的IP地址 # 如果有域名访问需求,还可以添加DNS.1 = gitlab.yourdomain.com - 用这个配置文件重新生成证书和私钥:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout gitlab.key -out gitlab.crt -config openssl.cnf - 替换GitLab容器内的证书文件(默认路径是
/etc/gitlab/ssl/,如果用了Docker卷挂载,直接替换宿主机对应目录的文件即可),然后重启GitLab容器:docker restart gitlab - 将新生成的
gitlab.crt复制到GitLab Runner容器的证书信任目录(比如/etc/gitlab-runner/certs/),或者通过卷挂载让Runner直接读取宿主机的证书文件,最后重启Runner容器:docker restart gitlab-runner - 重新注册Runner,此时证书验证就能正常通过了。
方案二:确保GitLab Runner完全禁用SSL验证(临时应急)
如果你之前尝试禁用验证没生效,大概率是配置没落实到位,需要注意两点:
- 注册阶段就要指定跳过验证:在注册Runner的命令里加上
--tls-skip-verify参数,示例:gitlab-runner register --url https://192.168.1.46/ --registration-token YOUR_REG_TOKEN --tls-skip-verify - 检查config.toml配置是否生效:注册完成后,打开Runner的
config.toml文件,确保[[runners]]区块下存在tls_skip_verify = true且未被注释:[[runners]] name = "my-docker-runner" url = "https://192.168.1.46/" token = "YOUR_RUNNER_TOKEN" executor = "docker" tls_skip_verify = true # 确认这一行存在并设置为true [runners.docker] # 其他Docker执行器配置... - 修改配置后必须重启Runner容器,让新配置生效:
docker restart gitlab-runner
⚠️ 注意:这种方式会跳过所有SSL证书验证,存在安全风险,仅适合测试环境临时使用,生产环境强烈推荐方案一。
内容的提问来源于stack exchange,提问作者Anton Polevyk
相关产品推荐
相关产品推荐

