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%。
传统 CA(比如 DigiCert、GeoTrust)收费高、流程繁琐、还要人工审核。Let’s Encrypt 不一样,全自动化:你申请,它验证,直接颁发。证书有效期 90 天,看着挺短,但配合自动续签机制,反而更安全。为什么?证书越短,暴露风险越小。
ACME 协议:自动化的核心
Let’s Encrypt 用的是 ACME 协议(Automated Certificate Management Environment),RFC 8555 标准。这个协议定义了怎么自动验证域名所有权、怎么颁发证书。
验证方式有三种:
- HTTP-01 验证:最常用。CA 会访问你域名下的特定路径(
/.well-known/acme-challenge/),检查是否包含验证令牌。证明你控制这个域名。 - DNS-01 验证:泛域名证书必须用这个。CA 检查 DNS TXT 记录里有没有验证令牌。不需要 Web 服务器,但需要 DNS API 权限。
- 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.timer 和 certbot.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.com、api.example.com、admin.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.com 和 example.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.com 和 v1.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.pem、cert2.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(比如测试),浏览器可能拒绝访问。谨慎使用。
监控与告警:主动发现问题
自动续签不是万能的。万一自动续签失败了,你需要提前知道。证书到期前一周收到告警,还有时间手动处理。
简单监控脚本
创建脚本检查证书剩余天数:
#!/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" [email protected] <<< "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 的自动化体系下变得简单可靠。
核心要点回顾:
- 原理理解:ACME 协议定义了自动验证和颁发流程。HTTP-01 和 DNS-01 是两种验证方式,各有适用场景。
- 自动续签:Certbot 安装后自动设置 systemd timer 或 cron job。续签触发条件是证书到期前 30 天,每天检查两次。
- 多域名管理:SAN 模式(单证书多域名)适合统一管理,泛域名证书适合大量子域名。按服务分组是推荐策略。
- 安全优化:HTTP/2、OCSP Stapling、禁用旧版 TLS、HSTS 配置,这些能让 SSL Labs 评级达到 A+。
- 监控告警:自动续签不是万能的,主动监控证书剩余天数,提前发现问题。
后续优化方向:
如果管理多台服务器、大量域名,可以考虑:
- 自动化平台:如 Cert Manager(Kubernetes)、Traefik(自动 SSL)
- 证书监控服务:如 SSL Monitor、Uptime Robot
- CI/CD 集成:部署时自动检查证书状态
证书管理这事儿,一旦自动化了,就不用再操心。网站安全了,用户信任了,搜索引擎也喜欢。凌晨三点的告警邮件,彻底成为过去。
配置 Let's Encrypt SSL 证书自动续签
完整的 SSL 证书配置流程,从安装 Certbot 到设置自动续签,确保网站 HTTPS 永不过期
⏱️ 预计耗时: 30 分钟
- 1
步骤1: 安装 Certbot
根据系统选择安装方式:
• Ubuntu/Debian(推荐):sudo snap install --classic certbot
• CentOS/RHEL:sudo yum install certbot
• 测试安装:certbot --version - 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: 验证自动续签
检查 Certbot 是否自动设置续签机制:
• Systemd Timer:sudo systemctl list-timers | grep certbot
• Dry Run 测试:sudo certbot renew --dry-run
• 确认输出 "successful" - 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: 安全加固配置
在 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: 设置监控告警
创建证书到期监控脚本:
• 创建脚本:sudo nano /usr/local/bin/check-ssl-expiry.sh
• 添加 Cron:0 6 * * * /usr/local/bin/check-ssl-expiry.sh
• 确保 Certbot 邮箱通知可用
常见问题
Let's Encrypt 证书有效期为什么只有 90 天?
HTTP-01 和 DNS-01 验证方式有什么区别?
DNS-01:CA 检查 DNS TXT 记录验证,需要 DNS API 权限。泛域名证书必须用这种方式。适合内网服务或大量子域名。
泛域名证书 *.example.com 能匹配哪些域名?
不匹配的情况:
• 二级子域名:sub.sub.example.com(需要单独申请 *.sub.example.com)
• 裸域名:example.com(必须单独添加 -d example.com)
Certbot 自动续签什么时候触发?
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 覆盖所有一级子域名
证书续签失败了怎么办?
常见失败原因:
• DNS 解析问题:等待 DNS 生效或手动续签 --force-renewal
• 端口占用:检查 80 端口,临时停止占用服务
• 防火墙阻止:开放 80/443 端口
• 权限问题:检查证书文件权限
解决后手动续签:sudo certbot renew --force-renewal
15 分钟阅读 · 发布于: 2026年4月2日 · 修改于: 2026年4月20日
相关文章
Nginx SSL/TLS 配置实战:从 HTTPS 证书到 A+ 安全加固
Nginx SSL/TLS 配置实战:从 HTTPS 证书到 A+ 安全加固
Supabase Edge Functions 实战:Deno 运行时与 TypeScript 开发指南
Supabase Edge Functions 实战:Deno 运行时与 TypeScript 开发指南
Docker 多阶段构建实战:生产镜像从 1GB 瘦身到 10MB

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