四、Nginx SSL 安全配置

获取证书后,需要优化Nginx配置以提升安全性:

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    # 证书路径
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # HSTS(强制HTTPS)
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    # 其他安全头
    add_header X-Frame-Options DENY always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-XSS-Protection "1; mode=block" always;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # 网站根目录
    root /var/www/html;
    index index.html;
}

# HTTP重定向到HTTPS
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://;
}

配置后验证并重启Nginx:

sudo nginx -t
sudo systemctl reload nginx

五、证书监控与告警

为了避免证书过期导致网站故障,需要建立监控机制。

5.1 本地监控脚本

#!/bin/bash
# check_ssl_expiry.sh

DOMAIN="example.com"
PORT=443
WARN_DAYS=30

expiry_date=
expiry_epoch=
current_epoch=1785546596
days_left=0

if [  -lt  ]; then
    echo "警告: SSL证书将在  天后过期!"
    # 这里可以添加邮件/短信告警逻辑
fi

5.2 使用在线监控工具

  • SSL Labs Server Test:免费的SSL配置检测工具,同时会显示证书过期时间。
  • UptimeRobot:可以监控证书过期,支持邮件、短信告警。
  • Prometheus + blackbox_exporter:适合企业级监控,自定义告警规则。

六、常见问题与解决方案

6.1 证书续期失败

常见原因:

  1. 80/443端口被防火墙阻挡
  2. 域名DNS解析变更
  3. Certbot版本过旧

解决方案:

# 升级Certbot
sudo apt update && sudo apt upgrade certbot

# 手动续期并查看详细日志
sudo certbot renew --verbose

6.2 证书路径变更

如果移动了证书文件,需要更新Nginx配置并重新加载:

# 查看证书实际路径
sudo certbot certificates

# 更新Nginx配置中的ssl_certificate和ssl_certificate_key路径
# 然后重启Nginx
sudo systemctl reload nginx

6.3 泛域名证书续期

泛域名证书必须使用DNS验证方式,确保DNS插件正确配置:

# 查看已安装的DNS插件
sudo find /usr/lib/python3/dist-packages/certbot_dns* -name "*.py" | head -5

七、总结

SSL证书管理是网站运维的基础工作,通过Certbot工具可以实现证书的自动获取和续期,配合完善的监控告警机制,可以完全避免证书过期导致的网站故障。建议运维人员:

  1. 优先选择Let's Encrypt免费证书,降低成本
  2. 配置自动续期任务,确保证书永不间断
  3. 定期检查SSL配置,使用最新的安全标准
  4. 建立证书监控告警,提前发现潜在问题

通过本文介绍的方法,你可以建立一套完善的SSL证书管理体系,让网站始终处于安全的HTTPS保护之下。