Certbot:申请公网HTTPS证书

如何使用 Certbot 申请公网证书

Pigsty 自带了 Certbot 工具,并默认于 Infra 节点上安装启用。

这意味着你可以直接通过 certbot 命令行工具,为你的 Nginx 服务器与公网域名申请真正的 Let’Encrypt 免费 HTTPS 证书,而不是使用 Pigsty 自签名的 HTTPS 证书。

为了做到这一点,你需要:

  1. 确定哪些域名需要证书
  2. 将这些域名指向您的服务器
  3. 使用 Certbot 申请证书
  4. 配置更新证书的定时任务
  5. 申请证书的一些注意事项

以下是如何去做的详细说明:


确定哪些域名需要证书

首先,您需要决定哪些 “上游服务” 需要真正的公网证书

infra_portal:
  home         : { domain: h.pigsty.cc }
  grafana      : { domain: g.pigsty.cc ,endpoint: "${admin_ip}:3000" ,websocket: true  }
  prometheus   : { domain: p.pigsty.cc ,endpoint: "${admin_ip}:9090" }
  alertmanager : { domain: a.pigsty.cc ,endpoint: "${admin_ip}:9093" }
  blackbox     : { endpoint: "${admin_ip}:9115" }
  loki         : { endpoint: "${admin_ip}:3100" }
  minio        : { domain: m.pigsty.cc    ,endpoint: "${admin_ip}:9001" ,scheme: https ,websocket: true }
  web          : { domain: pigsty.cc      ,path: "/www/web.cc" }
  repo         : { domain: repo.pigsty.cc ,path: "/www/repo"   }

例如在 infra_portal 中,假设我们要对外暴露以下五项服务:

  • Grafana 可视化监控面板的 g.pigsty.cc 域名
  • Prometheus 时序数据库的 p.pigsty.cc 域名
  • AlertManager 告警面板的 a.pigsty.cc 域名
  • Pigsty 文档站的 pigsty.cc 域名,指向本地文档目录
  • Pigsty 软件仓库的 repo.pigsty.cc 域名,指向软件仓库

这里的例子里特意没有选择为 home 主页申请真的 Let’s Encrypt 证书,原因见最后一节。


将这些域名指向您的服务器

接下来,您需要将上面选定的域名指向您服务器的 公网IP地址。 例如,Pigsty CC 站点的 IP 地址是 47.83.172.23,则可在域名注册商(如阿里云DNS控制台)上设置以下域名解析 A 记录:

47.83.172.23 pigsty.cc
47.83.172.23 g.pigsty.cc
47.83.172.23 p.pigsty.cc
47.83.172.23 a.pigsty.cc
47.83.172.23 repo.pigsty.cc 

修改完之后,可以使用


使用 Certbot 申请证书

第一次申请的时候,certbot 会提示你输入邮箱,并是否同意协议,按提示输入即可。

$ certbot --nginx -d pigsty.cc -d repo.pigsty.cc -d g.pigsty.cc -d p.pigsty.cc -d a.pigsty.cc
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): rh@vonng.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in
order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Account registered.
Requesting a certificate for pigsty.cc and 4 more domains

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/pigsty.cc/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/pigsty.cc/privkey.pem
This certificate expires on 2025-05-18.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for pigsty.cc to /etc/nginx/conf.d/web.conf
Successfully deployed certificate for repo.pigsty.cc to /etc/nginx/conf.d/repo.conf
Successfully deployed certificate for g.pigsty.cc to /etc/nginx/conf.d/grafana.conf
Successfully deployed certificate for p.pigsty.cc to /etc/nginx/conf.d/prometheus.conf
Successfully deployed certificate for a.pigsty.cc to /etc/nginx/conf.d/alertmanager.conf
Congratulations! You have successfully enabled HTTPS on https://pigsty.cc, https://repo.pigsty.cc, https://g.pigsty.cc, https://p.pigsty.cc, and https://a.pigsty.cc

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

首次申请之后,以后申请就可以省略这些步骤,直接使用这些命令了


配置更新证书的定时任务

默认情况下,申请的证书有效期为三个月,所以如果在证书有效期到期之前,你应该使用 certbot renew 对证书进行续期。

如果你需要更新证书,执行以下命令即可。

certbot renew

在真正执行之前,你可以使用 DryRun 模式来测试续期是否正常:

certbot renew --dry-run

如果你修改过 Nginx 配置文件,请务必确保 certbot 的修改不会影响你的配置文件。

你可以将这个命令配置为 crontab ,在每个月的第一天凌晨执行续期并打印日志。


申请证书的一些注意事项

这里请特别注意 home 的 SSL 证书,当你为其申请证书时,Certbot 申请证书会修改 Nginx 配置文件,将 80 的 HTTP 服务器重定向到 443 的 HTTPS 服务器。但这会影响默认 repo_upstream 中的本地软件仓库,除非你相应修改


最后修改 2025-02-18: add content (e4dc476)