老版本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
相关推荐
xlq223223 小时前
62.udp tcp原理
网络协议·tcp/ip·udp
Aaswk3 小时前
计算机网络概述
网络·网络协议·tcp/ip·计算机网络·http·dubbo
梦奇不是胖猫3 小时前
[ 计算机网络 | 第四章 ] 网络层 02 网际协议IP
运维·服务器·网络·网络协议·tcp/ip·计算机网络
林熙蕾LXL20 小时前
socket编程-TCP开发常用函数
网络协议·tcp/ip·php
林熙蕾LXL1 天前
传输层-UDP介绍
网络·网络协议·udp
运维有小邓@1 天前
SSL证书有效期大幅缩短,企业如何做好自动化管理?
ssl
Amnesia0_01 天前
网络层IP
网络·网络协议·tcp/ip
MR.欻1 天前
ZLMediaKit 源码分析(七):HTTP-FLV 低延迟直播流分析
网络·网络协议·http
北京耐用通信1 天前
耐达讯自动化PROFIBUS光纤模块:工业通信的“光电翻译官”
人工智能·科技·网络协议·自动化·信息与通信