在服务器上使用 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。


📄 参考资料

Leave a Reply

Your email address will not be published. Required fields are marked *