首页
/ Kubernetes Ingress-NGINX 控制器中的TLS证书序列号问题解析

Kubernetes Ingress-NGINX 控制器中的TLS证书序列号问题解析

2025-05-12 21:41:01作者:谭伦延

问题背景

在Kubernetes Ingress-NGINX控制器从v1.11.3升级到v1.11.4版本后,部分用户遇到了TLS认证失败的问题。具体表现为控制器无法读取配置的CA证书密钥,导致所有请求返回403错误。经过深入分析,发现这与Go语言1.23版本对X.509证书序列号的严格校验有关。

问题现象

用户报告在升级控制器版本后,出现以下错误日志:

error reading Ingress annotation: error obtaining certificate: local SSL certificate was not found
Error obtaining X.509 certificate: unexpected error creating SSL Cert: x509: negative serial number

这些错误导致Nginx配置中生成了一条直接返回403的规则,影响了所有经过该Ingress的请求。

根本原因

问题的根源在于Go 1.23版本对X.509证书解析的变更。在此版本之前,Go的x509.ParseCertificate函数能够接受带有负序列号的证书。但从Go 1.23开始,这一行为被修改为拒绝负序列号证书,除非显式设置GODEBUG环境变量包含"x509negativeserial=1"。

这一变更影响到了许多操作系统中默认包含的CA证书链,特别是Debian/Ubuntu等发行版中的/etc/ssl/certs/ca-certificates.crt文件。在这些标准信任存储中,存在一些历史遗留的根CA证书(如CATCert根证书)使用了负序列号,这些证书在RFC 2459时代是被允许的,尽管后续的RFC 3280和5280建议避免使用负序列号。

技术细节

  1. 证书序列号规范演进

    • RFC 2459(1999年):未明确禁止负序列号
    • RFC 3280(2002年):建议CA不要使用负序列号
    • RFC 5280(2008年):明确建议用户应优雅处理负序列号证书
  2. 实际影响

    • 使用操作系统默认CA存储作为Kubernetes Secret的内容时
    • 特别是当这些存储包含历史遗留的根CA证书时
    • 影响所有依赖TLS客户端证书验证的功能
  3. 版本差异

    • Ingress-NGINX v1.11.3及之前:使用Go 1.22或更早版本,能接受负序列号
    • Ingress-NGINX v1.11.4及之后:使用Go 1.23,默认拒绝负序列号

解决方案

对于遇到此问题的用户,有以下几种解决方案:

  1. 清理CA证书链

    • 从CA存储中移除带有负序列号的证书
    • 使用openssl工具检查并过滤证书:
      openssl x509 -in ca-certificates.crt -noout -serial | grep -v -- '^-'
      
  2. 临时回退版本

    • 暂时回退到Ingress-NGINX v1.11.3版本
    • 等待控制器提供兼容性修复
  3. 等待上游修复

    • 参考cert-manager/trust-manager项目的解决方案
    • 期待Ingress-NGINX项目提供类似的兼容性处理

最佳实践建议

  1. 证书管理

    • 定期审核和更新CA证书存储
    • 考虑使用专门的证书管理工具而非操作系统默认存储
  2. 升级策略

    • 在测试环境充分验证新版本控制器的证书处理行为
    • 特别注意TLS相关功能的回归测试
  3. 监控告警

    • 对Ingress控制器的证书解析错误建立监控
    • 设置适当的告警阈值

总结

这次事件凸显了基础设施组件版本升级时可能遇到的隐性问题。作为Kubernetes管理员,应当:

  1. 充分理解各组件依赖的基础库版本及其变更
  2. 建立完善的证书管理流程
  3. 在升级关键组件前进行全面的兼容性测试

随着PKI标准的不断演进,此类兼容性问题可能会继续出现,保持基础设施的及时更新和良好的监控体系是预防和快速解决问题的关键。

登录后查看全文
热门项目推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
144
229
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
718
461
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
107
166
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
311
1.04 K
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
368
358
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
117
255
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.02 K
0
open-eBackupopen-eBackup
open-eBackup是一款开源备份软件,采用集群高扩展架构,通过应用备份通用框架、并行备份等技术,为主流数据库、虚拟化、文件系统、大数据等应用提供E2E的数据备份、恢复等能力,帮助用户实现关键数据高效保护。
HTML
111
75
CangjieMagicCangjieMagic
基于仓颉编程语言构建的 LLM Agent 开发框架,其主要特点包括:Agent DSL、支持 MCP 协议,支持模块化调用,支持任务智能规划。
Cangjie
592
48
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
73
2