切换语言
中文 English 翻译中 日本語 翻译中
切换主题

SSL 证书配置:Let's Encrypt 自动续签与多域名管理

凌晨三点,监控告警的邮件炸醒了整个团队。网站访问不了,用户投诉电话打爆了客服。打开浏览器一看——红色警告页面:“此网站的安全证书已过期”。这下完了。

我爬起来连上服务器,发现 SSL 证书昨晚到期了。手动续签折腾到五点才搞定,回来睡了两小时又要上班。那种被坑的感觉,说实话,挺崩溃的。

这事儿之后我就想:能不能彻底杜绝证书过期?后来接触了 Let’s Encrypt,才发现免费 SSL 证书自动续签早就成熟了。只是很多开发者——包括当时的我——还停留在手动管理的老路子上。

这篇文章想解决的问题很明确:让你的 SSL 证书永远不会过期,而且多域名管理不再混乱。不管是个人博客还是公司服务,看完都能直接上手配置。


Let’s Encrypt 是什么?先搞清楚原理

说实话,很多人用 Let’s Encrypt 但不理解它的工作原理。知道原理后,遇到问题才能快速定位。

证书颁发机构(CA)的角色

Let’s Encrypt 是个证书颁发机构,简称 CA。它的定位很清晰:免费、自动化、开放。2016 年上线后,短短几年就推动了 HTTPS 的普及——现在超过 2 亿活跃证书,全球浏览器信任率 100%。

2亿+
活跃证书数量

传统 CA(比如 DigiCert、GeoTrust)收费高、流程繁琐、还要人工审核。Let’s Encrypt 不一样,全自动化:你申请,它验证,直接颁发。证书有效期 90 天,看着挺短,但配合自动续签机制,反而更安全。为什么?证书越短,暴露风险越小。

ACME 协议:自动化的核心

Let’s Encrypt 用的是 ACME 协议(Automated Certificate Management Environment),RFC 8555 标准。这个协议定义了怎么自动验证域名所有权、怎么颁发证书。

验证方式有三种

  1. HTTP-01 验证:最常用。CA 会访问你域名下的特定路径(/.well-known/acme-challenge/),检查是否包含验证令牌。证明你控制这个域名。
  2. DNS-01 验证:泛域名证书必须用这个。CA 检查 DNS TXT 记录里有没有验证令牌。不需要 Web 服务器,但需要 DNS API 权限。
  3. TLS-ALPN-01 验证:较少用,适合特殊场景。

HTTP-01 最简单,前提是你的 80 端口能访问。DNS-01 灵活,适合内网服务或泛域名。

Certbot:官方推荐的客户端

Certbot 是 Let’s Encrypt 官方推荐的客户端工具。它能帮你完成整个流程:申请证书、配置 Web 服务器、设置自动续签。

Certbot 的核心能力

  • 支持多种验证方式
  • 自动修改 Nginx/Apache 配置(通过插件)
  • 自动设置 systemd timer 或 cron job
  • 提供续签测试命令(dry-run)

明白这些原理后,后面配置时遇到问题,你就知道该查哪里了。


单域名 SSL 证书配置:从零开始

先从最简单的场景入手:一个域名,一台服务器。搞清楚基础流程后,多域名就顺理成章了。

安装 Certbot

不同系统安装方式不一样。Ubuntu/Debian 最简单,我推荐用 Snap——官方也推荐这种方式,版本更新及时。

Ubuntu/Debian(Snap 方式)

# 安装 Snap(如果还没)
sudo apt update
sudo apt install snapd

# 安装 Certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

CentOS/RHEL

sudo yum install certbot
# 或
sudo dnf install certbot

安装完成后,测试一下:

certbot --version
# 应该输出类似:certbot 2.11.0

获取证书:三种方式

Certbot 提供三种获取证书的方式,看你具体需求。

方式一:Nginx 插件自动配置(推荐新手)

最省事。Certbot 自动修改 Nginx 配置,申请证书、配置 HTTPS、设置重定向,一条命令搞定:

sudo certbot --nginx -d example.com -d www.example.com

执行过程会问你几个问题:

  • 邮箱地址(用于紧急通知)
  • 同意服务条款
  • 是否共享邮箱(选 No)
  • 重定向 HTTP 到 HTTPS(选 Yes,更安全)

完成后,Nginx 配置已经被改好了。证书路径会显示出来:

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem

方式二:Apache 插件自动配置

跟 Nginx 类似,只是插件换成 Apache:

sudo certbot --apache -d example.com -d www.example.com

方式三:仅获取证书(手动配置)

如果你不想让 Certbot 改配置,或者用的是其他 Web 服务器(Caddy、Node.js),可以用 certonly 模式:

sudo certbot certonly --webroot \
  -w /var/www/html \
  -d example.com \
  -d www.example.com

-w 指定 Web 根目录,Certbot 会在这里放验证文件。证书拿到后,你自己配置 Web 服务器。

验证证书是否生效

证书申请完成后,先确认是否正常工作。

检查证书文件

sudo ls -la /etc/letsencrypt/live/example.com/

应该看到四个文件:

  • cert.pem:证书本体
  • chain.pem:中间证书链
  • fullchain.pem:完整证书链(Nginx 用这个)
  • privkey.pem:私钥(Nginx 用这个)

SSL Labs 测试

访问 https://www.ssllabs.com/ssltest/,输入你的域名。测试会给出评级(A+ 到 F)。目标是至少拿到 A。

常见问题:

  • B 或 C:TLS 版本过低、加密套件弱。后面会讲怎么优化。
  • F:证书链不完整。检查 Nginx 配置用的是 fullchain.pem 而不是 cert.pem

浏览器访问

直接打开 https://example.com,地址栏应该显示锁图标。点击锁图标能看到证书详情,颁发者写着 “Let’s Encrypt”。


自动续签配置:永远不用担心过期

Let’s Encrypt 证书只有 90 天有效期。看着短,但配合自动续签,反而是优势——证书轮换快,暴露风险低。

Certbot 的自动续签机制

安装 Certbot 时,它自动设置了续签机制。不同系统方式不一样:

Systemd Timer(现代 Linux)

Certbot 安装后,会创建 certbot.timercertbot.service。Timer 每天运行两次,检查证书是否快到期(30 天内)。如果到期,就触发 Service 执行续签。

检查 Timer 状态:

sudo systemctl list-timers | grep certbot

输出类似:

NEXT                         LEFT          LAST                         PASSED       UNIT           ACTIVATES
Thu 2026-04-02 12:00:00 UTC  1h left       Thu 2026-04-02 00:00:00 UTC  11h ago      certbot.timer  certbot.service

能看到下次运行时间和上次运行时间。

Cron Job(传统方式)

如果系统没有 systemd(老版本 CentOS),Certbot 会设置 cron job。检查:

sudo crontab -l
# 或
cat /etc/cron.d/certbot

典型配置:

0 0,12 * * * root certbot renew --quiet

每天 0 点和 12 点运行续签检查。

验证自动续签是否工作

光看到 Timer 或 Cron 还不够,要确认续签真的能执行。

Dry Run 测试

Certbot 提供了测试命令,不会真的续签,只是模拟:

sudo certbot renew --dry-run

输出类似:

Processing /etc/letsencrypt/renewal/example.com.conf
Cert not due for renewal, but simulating renewal for dry run
...
The dry run was successful.

看到 “successful” 就说明自动续签配置正确。

检查续签配置文件

每个证书都有对应的续签配置文件:

cat /etc/letsencrypt/renewal/example.com.conf

文件里记录了证书申请时的参数、验证方式等。续签时会读取这个配置。

配置续签后自动重载 Web 服务器

证书续签后,Web 服务器还在用旧证书。需要重载配置才能生效。

Deploy Hook(推荐)

续签成功后自动执行命令:

sudo certbot renew --deploy-hook "systemctl reload nginx"

或者在续签配置文件里添加:

# 编辑 /etc/letsencrypt/renewal/example.com.conf
# 在最后添加:
deploy_hook = systemctl reload nginx

Post Hook(每次都执行)

不管续签是否成功都执行:

sudo certbot renew --post-hook "systemctl reload nginx"

区别在于:Deploy Hook 只在续签成功时触发,Post Hook 每次都触发。用 Deploy Hook 更合理。

续签失败怎么办?

自动续签不是万能的,偶尔会失败。常见原因和解决方法:

DNS 解析问题

域名 DNS 改了,但验证时 CA 还是查到旧 IP。等待 DNS 生效(TTL 时间),或者手动续签:

sudo certbot renew --force-renewal

防火墙或端口问题

HTTP-01 验证需要 80 端口可访问。检查防火墙:

sudo ufw status
sudo iptables -L -n

临时开放 80 端口:

sudo ufw allow 80/tcp

权限问题

证书文件权限错误。检查:

sudo ls -la /etc/letsencrypt/live/
sudo ls -la /etc/letsencrypt/archive/

确保 Web 服务器用户(如 www-data)能读取证书。

查看续签日志

失败时查看详细日志:

sudo tail -f /var/log/letsencrypt/letsencrypt.log

日志会记录失败原因。根据日志提示解决。


多域名 SSL 证书管理:统一与分散的策略

当你有多个域名时,证书管理策略很重要。搞不好就是一团乱麻——续签时间不同、证书文件散落各处、配置容易出错。

单证书多域名(SAN 模式)

最推荐的方式:一张证书包含多个域名。Certbot 申请时直接指定:

sudo certbot --nginx \
  -d example.com \
  -d www.example.com \
  -d api.example.com \
  -d admin.example.com

优势

  • 统一续签:一次续签,所有域名更新
  • 文件集中:只有一个证书目录
  • 配置简单:Web 服务器只需引用一个证书路径

SAN(Subject Alternative Names)扩展:这是证书里的字段,列出所有包含的域名。浏览器会检查访问的域名是否在 SAN 列表里。

查看证书包含的域名:

sudo certbot certificates

输出类似:

Found the following certs:
  Certificate Name: example.com
    Domains: example.com www.example.com api.example.com admin.example.com
    Expiry Date: 2026-07-01 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem

泛域名证书(Wildcard)

泛域名证书用通配符匹配所有子域名:*.example.com。一张证书覆盖 blog.example.comapi.example.comadmin.example.com 等。

必须用 DNS-01 验证:HTTP-01 不支持泛域名。Certbot 需要 DNS API 权限来添加 TXT 记录。

配置 DNS 插件

不同 DNS 服务商插件不同。Cloudflare 最常用:

# 安装 Cloudflare 插件
sudo snap install certbot-dns-cloudflare

# 创建凭证文件
sudo nano /root/.secrets/certbot/cloudflare.ini

凭证文件内容:

dns_cloudflare_api_token = your_cloudflare_api_token

API Token 在 Cloudflare 控制台生成,权限选 “DNS:Edit”。

申请泛域名证书

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini \
  -d "*.example.com" \
  -d example.com

注意:要同时申请 *.example.comexample.com。泛域名不匹配裸域名。

泛域名证书的限制

只匹配一级子域名*.example.com 匹配 sub.example.com,但不匹配 sub.sub.example.com

如果有二级子域名,需要单独申请:

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini \
  -d "*.example.com" \
  -d "*.api.example.com" \
  -d example.com

这样覆盖 api.example.comv1.api.example.com

多证书管理策略

什么时候用单证书多域名?什么时候用多证书?

按服务分组(推荐)

Web 服务组:主站、博客、文档

sudo certbot --nginx -d example.com -d www.example.com -d blog.example.com -d docs.example.com

API 服务组:API 端点、管理后台

sudo certbot --nginx -d api.example.com -d admin.example.com -d v1.api.example.com

内部服务组:监控、日志、内部工具

sudo certbot certonly --dns-cloudflare -d "*.internal.example.com"

优势

  • 续签影响范围可控:API 服务续签不影响 Web 服务
  • 权限隔离:内部服务证书权限可单独管理
  • 故障隔离:某证书出问题不影响其他服务

按域名层级分组

泛域名 + 单域名组合:

# 泛域名覆盖所有子域名
sudo certbot certonly --dns-cloudflare -d "*.example.com" -d example.com

# 特殊子域名单独证书(如需要特殊配置)
sudo certbot --nginx -d secure.example.com

证书文件路径详解

理解证书目录结构,管理多证书时不会混乱。

实际证书目录/etc/letsencrypt/live/[证书名]/

软链接指向最新证书。每次续签,链接会更新到新证书文件。

sudo ls -la /etc/letsencrypt/live/example.com/
lrwxrwxrwx 1 root root  42 Apr  2 12:00 cert.pem -> ../../archive/example.com/cert2.pem
lrwxrwxrwx 1 root root  43 Apr  2 12:00 chain.pem -> ../../archive/example.com/chain2.pem
lrwxrwxrwx 1 root root  44 Apr  2 12:00 fullchain.pem -> ../../archive/example.com/fullchain2.pem
lrwxrwxrwx 1 root root  40 Apr  2 12:00 privkey.pem -> ../../archive/example.com/privkey2.pem

证书存档目录/etc/letsencrypt/archive/[证书名]/

保存每次续签的证书历史。文件名带编号:cert1.pemcert2.pem 等。

续签配置目录/etc/letsencrypt/renewal/[证书名].conf

记录证书申请时的参数。续签时读取这个文件。

# 查看某证书的续签配置
cat /etc/letsencrypt/renewal/example.com.conf

配置里包含:

  • 验证方式(webroot、nginx、dns-cloudflare)
  • 原始域名列表
  • 部署 Hook 等

高级配置与优化:安全与性能的平衡

基础配置完成后,可以进一步优化。目标是安全性和性能兼顾。

HTTP/2 和 OCSP Stapling

HTTP/2 提升性能,OCSP Stapling 减少验证延迟。

Nginx 配置 HTTP/2

server {
    listen 443 ssl http2;  # 添加 http2
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # ... 其他配置
}

http2 加在 listen 指令后面。重载 Nginx:

sudo nginx -t
sudo systemctl reload nginx

OCSP Stapling 配置

OCSP(Online Certificate Status Protocol)验证证书状态。Stapling 让服务器提前获取验证结果,客户端不用单独请求 CA。

server {
    # ... SSL 配置

    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;
}

配置后,SSL Labs 测试能看到 “OCSP Stapling: Yes”。

安全加固:禁用旧版 TLS

TLS 1.0 和 1.1 已经不安全。2020 年后主流浏览器都弃用了。

server {
    # 只保留 TLS 1.2 和 1.3
    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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    ssl_prefer_server_ciphers on;

    # SSL Session 缓存(提升性能)
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
}

配置后,SSL Labs 测试应该达到 A 或 A+。

HSTS 头部配置

HSTS(HTTP Strict Transport Security)强制浏览器只用 HTTPS 访问。配置后,浏览器会记住这个域名必须用 HTTPS,就算用户输入 http://,浏览器也会自动跳转。

server {
    # ... SSL 配置

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}

参数说明:

  • max-age=31536000:有效期一年(秒)
  • includeSubDomains:包含所有子域名
  • preload:允许加入浏览器预加载列表

注意:配置 HSTS 后,如果临时需要 HTTP(比如测试),浏览器可能拒绝访问。谨慎使用。

监控与告警:主动发现问题

自动续签不是万能的。万一自动续签失败了,你需要提前知道。证书到期前一周收到告警,还有时间手动处理。

63%
证书故障由过期导致

简单监控脚本

创建脚本检查证书剩余天数:

#!/bin/bash
# /usr/local/bin/check-ssl-expiry.sh

DOMAIN="example.com"
EXPIRY_DAYS=$(openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)

EXPIRY_DATE=$(date -d "$EXPIRY_DAYS" +%s)
CURRENT_DATE=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_DATE - $CURRENT_DATE) / 86400 ))

if [ $DAYS_LEFT -lt 7 ]; then
    echo "WARNING: SSL certificate for $DOMAIN expires in $DAYS_LEFT days"
    # 发邮件告警(需要配置邮件服务)
    mail -s "SSL Certificate Expiry Warning" admin@example.com <<< "SSL certificate for $DOMAIN expires in $DAYS_LEFT days"
fi

添加到 cron,每天检查:

0 6 * * * /usr/local/bin/check-ssl-expiry.sh

Certbot 自动通知

Certbot 续签失败时,会给申请证书时的邮箱发邮件。确保邮箱地址正确、能收到邮件。


常见问题与解决方案

配置过程中可能遇到各种问题。这里汇总常见的坑和解决方法。

证书申请失败

原因一:域名 DNS 未解析到服务器

申请证书时,CA 要验证域名所有权。HTTP-01 验证需要访问域名。如果 DNS 还没解析,验证失败。

检查 DNS

dig example.com +short
# 或
nslookup example.com

确认返回的 IP 是你服务器 IP。

解决:等待 DNS 生效。TTL 时间(通常几分钟到几小时)后重试。

原因二:80 端口被占用或防火墙阻止

HTTP-01 验证通过 80 端口访问。如果端口被其他进程占用,或防火墙拦截,验证失败。

检查端口占用

sudo netstat -tulpn | grep :80
sudo lsof -i :80

如果不是 Nginx/Apache 占用,停止占用进程:

sudo systemctl stop占用服务名

检查防火墙

sudo ufw status
# 或
sudo iptables -L -n

开放 80 端口:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

原因三:Webroot 目录权限问题

certonly --webroot 方式时,Certbot 要在 Web 根目录创建验证文件。如果权限不够,失败。

检查目录权限

ls -la /var/www/html/.well-known/

确保 Certbot 用户(通常是 root)能写入。

手动创建目录

sudo mkdir -p /var/www/html/.well-known/acme-challenge
sudo chown -R www-data:www-data /var/www/html/.well-known

续签失败处理

自动续签偶尔失败,别慌。先查日志,再针对性解决。

查看 Certbot 日志

sudo tail -100 /var/log/letsencrypt/letsencrypt.log

日志会显示失败原因。常见错误:

  • Connection refused:端口问题
  • DNS problem: NXDOMAIN:DNS 解析问题
  • Rate limit exceeded:申请次数超限

手动强制续签

如果自动续签失败,手动续签:

sudo certbot renew --force-renewal

--force-renewal 强制续签,不管是否到期。

检查续签配置

续签配置文件损坏也会失败。检查:

cat /etc/letsencrypt/renewal/example.com.conf

确认配置正确。如果损坏,删除证书重新申请:

sudo certbot delete --cert-name example.com
sudo certbot --nginx -d example.com -d www.example.com

多证书冲突

多个证书时,Web 服务器可能引用错误的证书。

Nginx 证书路径错误

检查 Nginx 配置:

sudo nginx -T | grep ssl_certificate

确认每个 server block 用的证书路径正确。

常见错误

  • cert.pem 而不是 fullchain.pem(证书链不完整)
  • 引用错误的证书目录(证书名和域名不一致)

证书名和域名不一致

Certbot 用第一个域名作为证书名。比如:

sudo certbot --nginx -d api.example.com -d example.com

证书名是 api.example.com,路径是 /etc/letsencrypt/live/api.example.com/

如果 Nginx 配置里写 /etc/letsencrypt/live/example.com/,就找不到证书。

查看证书名

sudo certbot certificates

确认证书名和路径一致。

泛域名证书的限制

泛域名证书方便,但有局限。

只匹配一级子域名

*.example.com 匹配 sub.example.com,不匹配 sub.sub.example.com

如果有二级子域名,需要额外证书:

# 泛域名证书(一级)
sudo certbot certonly --dns-cloudflare -d "*.example.com" -d example.com

# 二级子域名证书
sudo certbot certonly --dns-cloudflare -d "*.api.example.com"

不匹配裸域名

*.example.com 不匹配 example.com(裸域名)。必须单独添加 -d example.com

错误示例

# 错误:裸域名访问不了
sudo certbot certonly --dns-cloudflare -d "*.example.com"

正确示例

# 正确:同时包含裸域名
sudo certbot certonly --dns-cloudflare -d "*.example.com" -d example.com

总结:从手动到自动的进化

折腾 SSL 证书的过程,其实是从手动到自动的进化。传统 CA 的手动流程,在 Let’s Encrypt 的自动化体系下变得简单可靠。

核心要点回顾

  1. 原理理解:ACME 协议定义了自动验证和颁发流程。HTTP-01 和 DNS-01 是两种验证方式,各有适用场景。
  2. 自动续签:Certbot 安装后自动设置 systemd timer 或 cron job。续签触发条件是证书到期前 30 天,每天检查两次。
  3. 多域名管理:SAN 模式(单证书多域名)适合统一管理,泛域名证书适合大量子域名。按服务分组是推荐策略。
  4. 安全优化:HTTP/2、OCSP Stapling、禁用旧版 TLS、HSTS 配置,这些能让 SSL Labs 评级达到 A+。
  5. 监控告警:自动续签不是万能的,主动监控证书剩余天数,提前发现问题。

后续优化方向

如果管理多台服务器、大量域名,可以考虑:

  • 自动化平台:如 Cert Manager(Kubernetes)、Traefik(自动 SSL)
  • 证书监控服务:如 SSL Monitor、Uptime Robot
  • CI/CD 集成:部署时自动检查证书状态

证书管理这事儿,一旦自动化了,就不用再操心。网站安全了,用户信任了,搜索引擎也喜欢。凌晨三点的告警邮件,彻底成为过去。

配置 Let's Encrypt SSL 证书自动续签

完整的 SSL 证书配置流程,从安装 Certbot 到设置自动续签,确保网站 HTTPS 永不过期

⏱️ 预计耗时: 30 分钟

  1. 1

    步骤1: 安装 Certbot

    根据系统选择安装方式:

    • Ubuntu/Debian(推荐):sudo snap install --classic certbot
    • CentOS/RHEL:sudo yum install certbot
    • 测试安装:certbot --version
  2. 2

    步骤2: 申请 SSL 证书

    选择适合的申请方式:

    • Nginx 自动配置:sudo certbot --nginx -d example.com -d www.example.com
    • Apache 自动配置:sudo certbot --apache -d example.com -d www.example.com
    • 仅获取证书:sudo certbot certonly --webroot -w /var/www/html -d example.com
  3. 3

    步骤3: 验证自动续签

    检查 Certbot 是否自动设置续签机制:

    • Systemd Timer:sudo systemctl list-timers | grep certbot
    • Dry Run 测试:sudo certbot renew --dry-run
    • 确认输出 "successful"
  4. 4

    步骤4: 配置续签后自动重载

    在续签配置文件中添加 Deploy Hook:

    • 编辑文件:sudo nano /etc/letsencrypt/renewal/example.com.conf
    • 添加配置:deploy_hook = systemctl reload nginx
    • 或命令行:sudo certbot renew --deploy-hook "systemctl reload nginx"
  5. 5

    步骤5: 安全加固配置

    在 Nginx 配置中添加安全优化:

    • 禁用旧 TLS:ssl_protocols TLSv1.2 TLSv1.3;
    • 启用 HTTP/2:listen 443 ssl http2;
    • OCSP Stapling:ssl_stapling on;
    • HSTS 头部:add_header Strict-Transport-Security "max-age=31536000" always;
  6. 6

    步骤6: 设置监控告警

    创建证书到期监控脚本:

    • 创建脚本:sudo nano /usr/local/bin/check-ssl-expiry.sh
    • 添加 Cron:0 6 * * * /usr/local/bin/check-ssl-expiry.sh
    • 确保 Certbot 邮箱通知可用

常见问题

Let's Encrypt 证书有效期为什么只有 90 天?
90 天有效期配合自动续签机制,反而更安全。证书轮换快,暴露风险小。如果私钥泄露,90 天后自动失效,降低长期风险。
HTTP-01 和 DNS-01 验证方式有什么区别?
HTTP-01:CA 访问域名特定路径验证,最简单,需要 80 端口可访问。适合单域名证书。

DNS-01:CA 检查 DNS TXT 记录验证,需要 DNS API 权限。泛域名证书必须用这种方式。适合内网服务或大量子域名。
泛域名证书 *.example.com 能匹配哪些域名?
只匹配一级子域名:sub.example.com、api.example.com、blog.example.com 等。

不匹配的情况:
• 二级子域名:sub.sub.example.com(需要单独申请 *.sub.example.com)
• 裸域名:example.com(必须单独添加 -d example.com)
Certbot 自动续签什么时候触发?
证书到期前 30 天自动触发。Systemd Timer 或 Cron Job 每天检查两次(通常 0 点和 12 点),发现证书即将到期就执行续签。续签成功后通过 Deploy Hook 自动重载 Web 服务器。
SSL Labs 测试评级 B 或 C 怎么解决?
常见原因及解决方法:

• TLS 版本过低:在 Nginx 配置 ssl_protocols TLSv1.2 TLSv1.3;
• 加密套件弱:配置推荐加密套件(见文章第六节)
• 证书链不完整:使用 fullchain.pem 而不是 cert.pem
• 缺少 OCSP Stapling:添加 ssl_stapling on; 配置

配置后重载 Nginx,重新测试应达到 A 或 A+。
多域名应该用单证书还是多证书?
推荐按服务分组策略:

• 单证书多域名(SAN 模式):适合相关域名,统一续签,配置简单。如 Web 服务组:example.com、www.example.com、blog.example.com
• 多证书分组:适合不同服务,故障隔离,权限分离。如 Web 服务、API 服务、内部服务分开管理
• 泛域名证书:适合大量子域名,减少证书数量。如 *.example.com 覆盖所有一级子域名
证书续签失败了怎么办?
先查看日志定位原因:sudo tail -100 /var/log/letsencrypt/letsencrypt.log

常见失败原因:
• DNS 解析问题:等待 DNS 生效或手动续签 --force-renewal
• 端口占用:检查 80 端口,临时停止占用服务
• 防火墙阻止:开放 80/443 端口
• 权限问题:检查证书文件权限

解决后手动续签:sudo certbot renew --force-renewal

15 分钟阅读 · 发布于: 2026年4月2日 · 修改于: 2026年4月20日

评论

使用 GitHub 账号登录后即可评论