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 即可正常执行。

相关推荐
dustcell.1 小时前
nginx的https搭建
运维·nginx·https
发光小北2 小时前
SG-NAT-410(NAT 网关)
网络协议
2301_764441332 小时前
python构建的基于WiFi重连流量分析的隐蔽摄像头检测
网络协议·网络安全·信息与通信
2501_915918412 小时前
iOS 手机抓包软件怎么选?HTTPS 调试、TCP 数据流分析与多工具组合的完整实践
android·ios·智能手机·小程序·https·uni-app·iphone
勇气要爆发3 小时前
问:TCP/UDP的区别及应用场景
网络协议·tcp/ip·udp
游戏开发爱好者83 小时前
iOS 应用上架的工程实践复盘,从构建交付到审核通过的全流程拆解
android·ios·小程序·https·uni-app·iphone·webview
Wokoo73 小时前
数据链路层:以太网、MAC 地址及 ARP 协议详解
服务器·网络·后端·网络协议·信号处理
ZeroNews内网穿透12 小时前
ZeroNews IP 访问控制能力
服务器·网络·网络协议·tcp/ip·安全·web安全·小程序
车载测试工程师12 小时前
CAPL学习-DoIP测试仪配置函数
网络协议·以太网·capl·canoe·doip