老版本Gitlab SSL证书自动续期错误KeyError: key not found: “token“解决

老版本Gitlab SSL证书自动续期错误KeyError: key not found: "token"解决

解决方案

赶时间的,先看解决办法,后面再说细节

因为有些CA提供商在域名为组织预先验证,并没有为其设置token,所以acme-client客户端v2.0.17以前的版本initialize_challenge方法中会因为这个参数报错

bash 复制代码
# 2.7.0、2.0.9这些版本,可能不一样,换成自己本地对应的版本号
# 根本问题找到authorization.rb即可
sudo vi /opt/gitlab/embedded/lib/ruby/gems/2.7.0/gems/acme-client-2.0.9/lib/acme/client/resources/authorization.rb

# 修改initialize_challenge方法
# 原本是token: attributes.fetch('token'),改为以下内容
token: attributes.fetch('token', nil),

# wq保存退出,重新配置Gitlab就发现全好了
sudo gitlab-ctl reconfigure

Acme-client Issue参考

acme-client 在v2.0.17才解决这个问题,提交记录参考如下:

Set authorization token to if there is no token in the challenge (#234nil)

所以可能大家搜到说:

  • 升级Gitlab(变相的升级了acme-client)
  • 更换其他签发证书的方式(跳过了acme签发证书)

都可以解决

排除过程(思路)

问题发现&报错

到日期了SSL证书也没有自动续签,运行sudo gitlab-ctl reconfigure报错

bash 复制代码
Running handlers:
There was an error running gitlab-ctl reconfigure:

letsencrypt_certificate[xxx.xxxx.cn] (letsencrypt::http_authorization line 6) had an error: KeyError: acme_certificate[staging] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/letsencrypt/resources/certificate.rb line 41) had an error: KeyError: key not found: "token"

查看更详细的日志

查看/var/log/gitlab/lets-encrypt/目录下最新的日志,1777570203按自己实际情况

bash 复制代码
tail -200f /var/log/gitlab/lets-encrypt/renewal.1777570203.log

查看相应时间的错误可以发现,本次更详细的堆栈问题在/opt/gitlab/embedded/cookbooks/cache/chef-stacktrace.out这个里面

bash 复制代码
[2026-05-01T01:30:22+08:00] INFO: Running queued delayed notifications before re-raising exception
[2026-05-01T01:30:22+08:00] ERROR: Running exception handlers
[2026-05-01T01:30:22+08:00] ERROR: Exception handlers complete
[2026-05-01T01:30:22+08:00] FATAL: Stacktrace dumped to /opt/gitlab/embedded/cookbooks/cache/chef-stacktrace.out
[2026-05-01T01:30:22+08:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
[2026-05-01T01:30:22+08:00] FATAL: KeyError: letsencrypt_certificate[xxxx.xxxx.cn] (letsencrypt::http_authorization line 6) had an error: KeyError: acme_certificate[staging] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/letsencrypt/resources/certificate.rb line 41) had an error: KeyError: key not found: "token"

查看错误的Stacktrace dumped(堆栈报告)

查看/opt/gitlab/embedded/cookbooks/cache/chef-stacktrace.out

bash 复制代码
tail -200f /opt/gitlab/embedded/cookbooks/cache/chef-stacktrace.out

找到错误发生的行>>>> Caused by KeyError

bash 复制代码
>>>> Caused by KeyError: key not found: "token"
/opt/gitlab/embedded/lib/ruby/gems/2.7.0/gems/acme-client-2.0.9/lib/acme/client/resources/authorization.rb:59:in `fetch'
/opt/gitlab/embedded/lib/ruby/gems/2.7.0/gems/acme-client-2.0.9/lib/acme/client/resources/authorization.rb:59:in `initialize_challenge'
/opt/gitlab/embedded/lib/ruby/gems/2.7.0/gems/acme-client-2.0.9/lib/acme/client/resources/authorization.rb:23:in `block in challenges'
/opt/gitlab/embedded/lib/ruby/gems/2.7.0/gems/acme-client-2.0.9/lib/acme/client/resources/authorization.rb:22:in `map'
/opt/gitlab/embedded/lib/ruby/gems/2.7.0/gems/acme-client-2.0.9/lib/acme/client/resources/authorization.rb:22:in `challenges'
/opt/gitlab/embedded/lib/ruby/gems/2.7.0/gems/acme-client-2.0.9/lib/acme/client/resources/authorization.rb:28:in `http01'

可以发现错误源自authorization.rb59行fetch

查看并修改源码

查看authorization.rbinitialize_challenge方法的fetch token

参考Issue Set authorization token to if there is no token in the challenge (#234nil)修改

bash 复制代码
vi /opt/gitlab/embedded/lib/ruby/gems/2.7.0/gems/acme-client-2.0.9/lib/acme/client/resources/authorization.rb

#########
  def initialize_challenge(attributes)
    arguments = {
      type: attributes.fetch('type'),
      status: attributes.fetch('status'),
      url: attributes.fetch('url'),
      token: attributes.fetch('token', nil), # 增加, nil 默认值
      error: attributes['error']
    }
    Acme::Client::Resources::Challenges.new(@client, **arguments)
  end
#########
# wq 保存退出

重新配置Gitlab

bash 复制代码
sudo gitlab-ctl reconfigure
相关推荐
酒神dnspup10 小时前
CDN 回源检测怎么做?用 DNSPup 验证节点命中、源站暴露与多地可用性
运维·服务器·网络·网络协议·tcp/ip
酒神dnspup12 小时前
Tcping 端口连通性检测教程:用 DNSPup 判断防火墙、监听与线路故障
网络·网络协议·tcp/ip·ip·dnspup
CDN36020 小时前
360CDN发布HTTP/3(QUIC)弱网加速方案:实测首屏提速40%,彻底终结移动端接口超时与频繁断连
网络·网络协议·http
SWAGGY..21 小时前
【C++ 初阶】:(12)深入理解C++ stack:容器适配器、底层容器与算法实战
网络·网络协议·rpc
我星期八休息21 小时前
Linux—五种IO模型与非阻塞IO
linux·运维·服务器·网络·数据库·网络协议
oooo_z1 天前
WebSocket实时行情推送API实战:用iTick搭一个盯盘小工具
网络·websocket·网络协议
Loongproxy1 天前
2026年动态IP代理真实可用率怎么横评?爬虫选代理的关键是什么
服务器·网络·网络协议·tcp/ip
Mortalbreeze1 天前
深入理解 TCP 协议(二):TCP 可靠传输与高效通信机制详解
linux·服务器·网络·网络协议·tcp/ip
2401_868534781 天前
企业信息安全建设
linux·网络协议·beautifulsoup