在服务器上使用 HTTPS 是保证安全访问的必备措施,而 Let’s Encrypt 提供了免费的 SSL 证书,结合 Certbot 工具可以非常方便地申请和更新证书。
在实际场景中,往往不仅需要为主域名配置证书,还要同时支持多个子域名,比如:
python-replCopyEditwww.domain.com
mail.domain.com
app1.domain.com
app2.domain.com
...
以下是一次完整实践记录,总结关键步骤与注意事项。
💡 证书现状查看
首先查看现有证书及已包含的域名:
bashCopyEditcertbot certificates
输出示例:
yamlCopyEditFound the following certs:
Certificate Name: domain.com
Domains: domain.com mail.domain.com www.domain.com
Expiry Date: 2025-09-22 21:50:18+00:00 (VALID: 82 days)
Certificate Path: /etc/letsencrypt/live/domain.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/domain.com/privkey.pem
🔄 重新申请并添加更多子域名
为了将所有需要的子域名统一到一个证书中,执行以下命令(使用 --standalone 模式):
bashCopyEditcertbot certonly --standalone \
-d domain.com \
-d www.domain.com \
-d mail.domain.com \
-d app1.domain.com \
-d app2.domain.com \
-d app3.domain.com \
-d app4.domain.com \
-d app5.domain.com \
-d app6.domain.com \
-d app7.domain.com \
-d app8.domain.com \
-d app9.domain.com \
-d app10.domain.com \
--agree-tos \
-m admin@example.com \
--cert-name domain.com
⚠️ 注意事项
- 所有子域名的 DNS 必须已解析到对应服务器的公网 IP,否则无法通过验证。
- 需要暂时关闭占用 80 端口的服务(因为
standalone模式会临时开启 HTTP 服务进行验证)。 - 新的证书会覆盖之前同名证书中保存的域名列表,未列出的域名将会被移除。
🟢 更新确认
执行过程中会提示是否更新,选择 U(Update)即可。完成后,终端输出:
swiftCopyEditSuccessfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/domain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/domain.com/privkey.pem
This certificate expires on 2025-09-30.
证书会自动安排定期续期任务,无需额外操作。
🚀 服务重载
为了让新证书立即生效,需要重载或重启 web 服务,例如 Nginx:
bashCopyEditnginx -s reload
或
bashCopyEditsystemctl reload nginx
Apache 则使用:
bashCopyEditsystemctl reload apache2
⚡ 总结
- Certbot 可用于一次性签发并更新含有多个子域名的证书,统一管理更加简洁高效。
- 每次更新都需包含所有需要保留的域名,否则会被移除。
- 配合自动续期和自动 reload,可实现全自动无感知更新。
💬 后续可选优化
✅ 配置自动续期钩子脚本,实现证书续期后自动重载 web 服务。
✅ 定期检查 DNS 解析与访问状态,保证证书验证不出错。
✅ 可以使用监控或小工具定期验证各个子域名是否正确启用 HTTPS。
📄 参考资料