背景

在维护个人博客(基于 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
2
sudo apt remove certbot -y
sudo apt autoremove -y

使用 snap 安装官方版本 certbot

1
2
3
4
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

验证安装

1
certbot --version

确保版本为:

1
certbot 2.x.x

重新申请证书

1
sudo certbot --nginx -d chaincipher.cn -d www.chaincipher.cn

执行结果:

1
2
Successfully deployed certificate
Your existing certificate has been successfully renewed

验证结果

浏览器验证

  • 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 使用国外源
    解决:
  • 等待或使用代理

经验总结

  1. HTTPS 证书有效期为 90 天,必须依赖自动续期
  2. 避免混用 apt 和 pip 安装系统工具
  3. snap 提供更稳定的隔离环境
  4. Web 服务必须定期检查证书状态

总结

本次问题从表面上看是证书过期,实质上是系统环境冲突导致工具失效。
通过重新安装 certbot 并采用 snap 管理,成功恢复 HTTPS 服务。
这次排障让我更加理解了:

  • Linux 环境依赖管理
  • HTTPS 证书机制
  • Web 服务稳定性保障

后记

对于线上服务来说:

“能运行”远远不够,“能稳定运行”才是关键。
未来将继续完善自动化监控与安全机制,提升系统可靠性。