一次 HTTPS 证书过期引发的排障与修复实战
背景
在维护个人博客(基于 Hexo + Flask + Nginx + Gunicorn 架构)过程中,发现网站突然出现“不安全”提示。
经检查发现 HTTPS 证书已经过期,导致浏览器拒绝信任连接。
本文记录一次完整的排障与修复过程,以及其中踩过的坑和经验总结。
问题现象
访问网站:
1 | https://chaincipher.cn |
浏览器提示:
- 证书已过期
- 连接不安全
服务器执行:
1 | certbot certificates |
直接报错:
1 | AttributeError: module 'lib' has no attribute 'OpenSSL_add_all_algorithms' |
问题分析
表面问题
- HTTPS 证书过期
- certbot 工具无法正常运行
深层原因
报错核心:
1 | OpenSSL_add_all_algorithms |
说明:
系统 OpenSSL 与 Python 依赖库(pyOpenSSL / cryptography)发生冲突
原因可能包括:
- 使用 pip 安装过相关库
- 系统升级导致依赖不兼容
解决方案
移除旧版本 certbot
1 | sudo apt remove certbot -y |
使用 snap 安装官方版本 certbot
1 | sudo snap install core |
验证安装
1 | certbot --version |
确保版本为:
1 | certbot 2.x.x |
重新申请证书
1 | sudo certbot --nginx -d chaincipher.cn -d www.chaincipher.cn |
执行结果:
1 | Successfully deployed certificate |
验证结果
浏览器验证
- HTTPS 正常
- 无安全警告
- 小锁恢复
证书有效期检查
1 | openssl x509 -in /etc/letsencrypt/live/chaincipher.cn/fullchain.pem -noout -dates |
安全增强(进阶优化)
启用 HSTS
在 Nginx 配置中添加:
1 | add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; |
作用:
- 强制浏览器始终使用 HTTPS
- 防止降级攻击
自动续期验证
1 | sudo certbot renew --dry-run |
确保自动续期机制正常。
踩坑总结
问题1:certbot 无法运行
原因:
- Python 环境依赖冲突
解决: - 使用 snap 隔离环境
问题2:证书未自动续期
原因:
- 定时任务未生效
解决: - 使用 snap 版本自带自动续期
问题3:下载速度慢
原因:
- snap 使用国外源
解决: - 等待或使用代理
经验总结
- HTTPS 证书有效期为 90 天,必须依赖自动续期
- 避免混用 apt 和 pip 安装系统工具
- snap 提供更稳定的隔离环境
- Web 服务必须定期检查证书状态
总结
本次问题从表面上看是证书过期,实质上是系统环境冲突导致工具失效。
通过重新安装 certbot 并采用 snap 管理,成功恢复 HTTPS 服务。
这次排障让我更加理解了:
- Linux 环境依赖管理
- HTTPS 证书机制
- Web 服务稳定性保障
后记
对于线上服务来说:
“能运行”远远不够,“能稳定运行”才是关键。
未来将继续完善自动化监控与安全机制,提升系统可靠性。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 John neo's blog!
