gitlab内网配置https配置加载异常

配置重加载异常:

There was an error running gitlab-ctl reconfigure: letsencrypt_certificate[192.168.109.110] (letsencrypt::http_authorization line 3) had an error: Faraday::ConnectionFailed: acme_certificate[staging] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/letsencrypt/resources/certificate.rb line 20) had an error: Faraday::ConnectionFailed: Failed to open TCP connection to acme-staging.api.letsencrypt.org:443 (getaddrinfo: Name or service not known)

这个错误的核心原因是 GitLab 服务器无法解析 Let's Encrypt 的 ACME 服务器域名acme-staging.api.letsencrypt.org),导致无法建立 HTTPS 连接申请证书。以下是分步排查和解决方案:

一、先明确关键前提(避免无效操作)

Let's Encrypt 证书仅支持公网可访问的域名 (如 gitlab.yourdomain.com),不支持内网 IP(如 192.168.109.110)!如果你的 GitLab 仅部署在内网、没有公网域名和公网访问权限,无法使用 Let's Encrypt 自动签发证书,建议直接跳过 Let's Encrypt 配置,改用自签名证书或内网 CA 证书(后续会补充方案)。

二、若有公网域名和公网访问权限(解决 DNS 解析问题)

错误本质是服务器 DNS 解析失败,按以下步骤排查:

1. 测试服务器是否能解析 Let's Encrypt 域名

登录 GitLab 服务器,执行以下命令测试 DNS 解析:

bash

运行

复制代码
# 测试解析 Let's Encrypt  staging 服务器(错误中提到的域名)
nslookup acme-staging.api.letsencrypt.org

# 测试解析 Let's Encrypt 生产服务器(正式环境用)
nslookup acme-v02.api.letsencrypt.org

# 测试公网连通性(如百度),排除服务器断网
nslookup www.baidu.com
  • 若输出 Name or service not known:说明 DNS 配置有问题,进入步骤 2。
  • 若能正常解析(返回 IP 地址):进入步骤 3 测试网络连通性。
2. 修复 DNS 配置(核心解决步骤)

服务器无法解析域名,通常是 /etc/resolv.conf 中 DNS 服务器配置错误或不可用。

方法 1:临时更换 DNS 测试(立即生效,重启后失效)

bash

运行

复制代码
# 编辑 resolv.conf,添加公共 DNS(如 8.8.8.8 或 114.114.114.114)
sudo vi /etc/resolv.conf

# 添加以下内容(替换原有 nameserver 行)
nameserver 8.8.8.8  # Google DNS
nameserver 114.114.114.114  # 国内 DNS
方法 2:永久修改 DNS(推荐,避免重启失效)

不同系统修改方式不同,以主流系统为例:

  • Ubuntu/Debian :编辑网络配置文件(以 eth0 网卡为例,根据实际网卡名修改):

    复制代码
    sudo vi /etc/network/interfaces

    在网卡配置中添加 DNS:

    复制代码
    iface eth0 inet static
      # 原有 IP、网关等配置不变
      dns-nameservers 8.8.8.8 114.114.114.114

    重启网络:

    复制代码
    sudo systemctl restart networking
  • CentOS/RHEL :编辑网卡配置文件(以 ens33 为例):

    复制代码
    sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33

    添加 / 修改 DNS 配置:

    复制代码
    DNS1=8.8.8.8
    DNS2=114.114.114.114

    重启网络:

    复制代码
    sudo systemctl restart network
验证 DNS 修复

修改后重新执行 nslookup acme-staging.api.letsencrypt.org,若能返回 IP(如下)则说明 DNS 已修复:

复制代码
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
acme-staging.api.letsencrypt.org	canonical name = staging.api.letsencrypt.org.
staging.api.letsencrypt.org	canonical name = prod.api.letsencrypt.org.edgesuite.net.
prod.api.letsencrypt.org.edgesuite.net	canonical name = e1767.dscb.akamaiedge.net.
Name:	e1767.dscb.akamaiedge.net
Address: 23.36.77.114
3. 测试 443 端口连通性(排除防火墙 / 网络限制)

DNS 修复后,若仍报错,可能是服务器防火墙或网关限制了 443 端口(Let's Encrypt 需通过 443 通信):

复制代码
# 测试 TCP 连接 443 端口
telnet acme-staging.api.letsencrypt.org 443

# 或用 curl 测试(更直观)
curl -v https://acme-staging.api.letsencrypt.org
  • 若输出 Connected to acme-staging.api.letsencrypt.org 或 curl 返回 HTTP/1.1 200 OK:说明网络连通正常。

  • 若超时 / 拒绝连接:需开放 443 出站端口(Let's Encrypt 仅需服务器主动访问公网 443,无需公网访问服务器 443):

    复制代码
    # CentOS/RHEL 开放 443 出站(firewalld)
    sudo firewall-cmd --permanent --add-port=443/tcp
    sudo firewall-cmd --reload
    
    # Ubuntu/Debian 开放 443 出站(ufw)
    sudo ufw allow out 443/tcp

    若服务器在云环境(如阿里云、AWS),还需检查安全组规则,允许 443 出站流量。

4. 重新执行 gitlab-ctl reconfigure

修复 DNS 和网络后,重新运行配置命令:

复制代码
sudo gitlab-ctl reconfigure

若仍报错,可能是 Let's Encrypt 配置有误(如域名未指向服务器公网 IP),需检查 gitlab.rb 中的 Let's Encrypt 配置:

复制代码
sudo vi /etc/gitlab/gitlab.rb

确保配置正确(替换为你的公网域名):

复制代码
# 禁用内置 NGINX 的自动 HTTPS(由 Let's Encrypt 管理)
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{external_url_host}.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{external_url_host}.key"

# Let's Encrypt 配置(必须用公网域名,不能用 IP)
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['your-email@example.com']  # 接收证书过期通知
letsencrypt['domain'] = 'gitlab.yourdomain.com'  # 你的公网域名(需解析到服务器公网 IP)
letsencrypt['auto_renew'] = true

修改后执行 sudo gitlab-ctl reconfigure 生效。

三、若为内网环境(无公网域名 / 访问权限):跳过 Let's Encrypt

内网 GitLab 无法使用 Let's Encrypt,建议用以下方案替代:

方案 1:使用自签名证书
  1. 生成自签名证书(替换为你的内网域名或 IP):

    复制代码
    sudo mkdir -p /etc/gitlab/ssl
    sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
      -keyout /etc/gitlab/ssl/gitlab.key \
      -out /etc/gitlab/ssl/gitlab.crt

    执行时按提示填写信息(Common Name 填内网域名或 IP,如 192.168.109.110)。

  2. 配置 GitLab 使用自签名证书:

    复制代码
    sudo vi /etc/gitlab/gitlab.rb

    添加以下配置(注释掉原有 Let's Encrypt 相关配置):

    复制代码
    external_url 'https://192.168.109.110'  # 内网 HTTPS 地址
    nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.crt"
    nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key"
    nginx['redirect_http_to_https'] = true  # HTTP 重定向到 HTTPS
  3. 重新配置 GitLab:

    复制代码
    sudo gitlab-ctl reconfigure
方案 2:使用内网 CA 证书(推荐企业内网)

若企业有内部 CA 服务器,可申请内网可信证书,配置方式与自签名证书一致(仅替换 gitlab.crtgitlab.key 为 CA 签发的证书即可),客户端无需忽略证书警告。

总结

  1. 若用 Let's Encrypt:必须有公网域名 + 公网访问权限,先修复 DNS 解析(更换公共 DNS),再开放 443 出站端口,最后重新配置。
  2. 若为内网环境:直接放弃 Let's Encrypt,使用自签名证书或内网 CA 证书,配置步骤更简单且稳定。

按以上步骤操作后,gitlab-ctl reconfigure 即可正常执行。

相关推荐
一条懒鱼66621 分钟前
Jenkins 2.528.3 与 GitLab 深度集成:实现自动构建
servlet·gitlab·jenkins
游戏开发爱好者81 小时前
对 iOS IPA 文件进行深度混淆的一种实现路径
android·ios·小程序·https·uni-app·iphone·webview
老王熬夜敲代码1 小时前
TCP相关问题的解决
linux·网络·笔记·网络协议
张人玉2 小时前
WPF HTTPS 通信示例使用说明
数据库·网络协议·http·c#·wpf
辉视广播对讲2 小时前
SIP广播对讲系统:引领未来IP广播的主流方向
网络·网络协议·tcp/ip
科技块儿2 小时前
【深度解析】在响应速度与数据安全上权衡在线IP查询API与本地IP离线库
数据库·网络协议·tcp/ip
张人玉2 小时前
WPF HTTPS 通信示例代码分析笔记
笔记·https·wpf
吃喝不愁霸王餐APP开发者2 小时前
Java应用对接美团开放平台API时的HTTPS双向认证与证书管理实践
java·开发语言·https
北京耐用通信2 小时前
预算减半,效率翻倍:耐达讯自动化Profibus六路中继器如何成为工程师的“省钱利器”
人工智能·物联网·网络协议·自动化·信息与通信
渡我白衣2 小时前
计算机组成原理(9):零拓展与符号拓展
c语言·汇编·人工智能·嵌入式硬件·网络协议·硬件工程·c