如何为Docker容器内HAProxy反向代理后的GitLab配置Let's Encrypt证书
反向代理后GitLab启用Let's Encrypt失败解决方案
错误根因
报错显示Let's Encrypt的HTTP-01域名验证请求超时,核心原因是HAProxy反向代理的架构下,GitLab默认的内置Let's Encrypt配置没有适配代理场景,公网的验证请求无法正确到达GitLab的acme挑战响应服务。
推荐方案:证书统一在HAProxy层管理(架构更清晰,维护成本更低)
修改GitLab核心配置,关闭内置SSL和内置证书签发功能
编辑GitLab配置文件/etc/gitlab/gitlab.rb,修改对应配置项:# 关闭GitLab内置的Let's Encrypt自动签发功能 letsencrypt['enable'] = false # 配置外部访问的域名,注意开头为https external_url 'https://domain.com' # 配置GitLab Nginx监听80端口,不处理HTTPS nginx['listen_port'] = 80 nginx['listen_https'] = false # 配置信任反向代理的请求头,避免GitLab识别协议错误 nginx['proxy_set_headers'] = { "X-Forwarded-Proto" => "https", "X-Forwarded-Ssl" => "on" }修改完成后执行
gitlab-ctl reconfigure让配置生效。配置HAProxy层证书签发与转发
在HAProxy所在服务器安装certbot等证书管理工具,直接为你的域名申请Let's Encrypt证书,配置HAProxy规则:- 开放80端口,放行所有
/.well-known/acme-challenge/前缀的请求用于证书验证 - 443端口绑定已签发的SSL证书,将所有HTTPS请求转发到GitLab的80端口即可
- 开放80端口,放行所有
可选方案:保留GitLab内置证书签发功能
如果需要让GitLab自己管理证书,按以下规则调整配置:
- HAProxy配置调整:80端口的所有请求(尤其是
/.well-known/acme-challenge/前缀的请求)必须直接转发到GitLab的80端口,不要强制跳转HTTPS,不要添加访问控制、限速规则 - 修改GitLab配置文件
/etc/gitlab/gitlab.rb:
调整完成后执行external_url 'https://domain.com' letsencrypt['enable'] = true letsencrypt['auto_renew'] = true # 信任HAProxy的内网IP,避免IP识别错误 nginx['real_ip_trusted_addresses'] = ['替换为HAProxy的内网IP/32'] nginx['real_ip_header'] = 'X-Forwarded-For' nginx['real_ip_recursive'] = 'on'gitlab-ctl reconfigure,重新触发证书申请即可。
必做校验项
- 你的域名必须正确解析到HAProxy的公网IP
- HAProxy所在服务器的防火墙、云服务商安全组必须开放80端口的公网入站权限,Let's Encrypt的HTTP-01验证必须通过80端口完成
- 不要给
/.well-known/路径添加任何访问限制规则
内容的提问来源于stack exchange,提问作者andreas.teich
相关产品推荐
相关产品推荐

