管理证书和设置自动更新
1. 检查当前证书
命令 certbot certificates
咱们从简单的开始:怎么查看你服务器上已经安装了哪些证书?Let's Encrypt 提供了一个很方便的工具 — certbot
。用命令 certbot certificates
可以获取当前证书的详细信息。
sudo certbot certificates
运行之后你会看到类似这样的结果:
Found the following certs:
Certificate Name: example.com
Domains: example.com www.example.com
Expiry Date: 2023-12-31 10:00:00+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
这里会列出一些重要的细节:
- 证书名称。
- 证书覆盖的域名。
- 到期日期(这样你可以及时更新)。
- 证书文件和私钥文件的路径。
一个小技巧:
如果你有忽略过期提醒的“坏习惯”,那么这个命令会是你最好的朋友。毕竟,没有人想成为知道证书过期消息后被用户“教做人”的程序员。
2. 证书自动更新
Let's Encrypt的内部机制
Let's Encrypt的证书有效期是90天,这样可以最大程度减少安全风险。但每3个月手动更新一次,这实在不现实。幸运的是,有一个内置的命令可以用来实现自动化:
sudo certbot renew
这个过程会检查所有证书,并自动更新那些接近失效的证书。
通过Cron
设置自动更新
Cron
是Linux系统中一个内置的任务计划工具。它可以按照预设的时间表运行命令,这正是我们需要用来自动化证书更新的工具。以下是Cron的配置方式:
打开当前用户的
Cron
编辑器:sudo crontab -e
在文件末尾添加以下行:
0 0 * * * certbot renew --quiet
这条命令会每天午夜运行
certbot renew
。--quiet
标志会屏蔽不必要的输出,所以更新过程会安静地进行,不打扰任何人。保存更改并退出编辑器。
现在你的服务器会自动更新证书,你就不用再担心证书到期的问题了(或者几乎不用了)。
3. 手动更新证书
有时候自动化不能解决所有问题,你需要手动更新证书。比如,当你刚刚在网站配置中添加了新域名时,你需要手动请求一个新的证书。这时又需要使用certbot
:
命令示例:
sudo certbot renew
更新指定域名的证书
如果你需要更新与某个特定域名关联的证书,可以使用以下命令格式:
sudo certbot certonly --nginx -d example.com -d www.example.com
这里:
--nginx
表示配置会被自动应用到Nginx服务器。如果是Apache服务器,可以使用--apache
。-d
标志用于列出需要证书的域名。
执行命令后,Certbot会检查服务器配置,申请新的证书并完成配置。
4. 通知和监控
Email通知
安装Certbot时,它会要求你提供email地址。如果你提供了,那么在证书到期前20天,你就会收到通知。如果你没有提供email或者想更换,可以这样做:
sudo certbot register --update-registration --email newaddress@example.com
现在你几乎不会被任何情况所困扰了。嗯,几乎。
外部检查
有一些第三方服务可以帮你跟踪证书的有效期。比如,SSL Labs。只需输入网站地址,服务就会检查它的证书,包括有效期、信任链和安全级别。
5. 删除不需要的证书
有时候,旧证书可能不再需要了,比如你不再维护某个域名了。为了防止系统变得杂乱,最好删除它们。
删除证书的命令:
sudo certbot delete
Certbot 会显示可用证书的列表,并让你选择要删除的证书。
有用的小提示:
删除证书时要小心,别不小心搞崩了运行中的网站。一定要确认这个证书已经没有任何地方在用了。
6. 示例和错误调试
更新后检查
在对证书进行任何更改或更新之后,一定要检查网站是否正常运行。最简单的方法是使用curl
:
curl -I https://example.com
预期结果 — 代码 HTTP/1.1 200 OK
。
如果发生任何问题,首先查看日志:
Nginx日志:
sudo tail -f /var/log/nginx/error.log
Apache日志:
sudo tail -f /var/log/apache2/error.log
常见错误: "Too Many Requests"
如果你过于频繁地请求新证书,Let's Encrypt可能会因"Too Many Requests"错误而限制你的访问。在这种情况下,建议使用Let's Encrypt的测试服务器:
sudo certbot certonly --test-cert --nginx -d example.com
这个命令会生成一个测试证书,该证书无法用于实际场景,但可以帮助检查配置。
7. 最后一步:自动重启Web服务器
Let's Encrypt会更新证书文件,但像Nginx或Apache这样的Web服务器在未重启前不会察觉到这些更改。这也能自动化处理。更新Cron记录:
0 0 * * * certbot renew --quiet && systemctl reload nginx
或者对于Apache:
0 0 * * * certbot renew --quiet && systemctl reload apache2
现在任何证书更新之后,都会立即应用到服务器上。
这节讲座的目的是让你晚上可以安心睡觉,知道你的证书会自动更新,网站已保护好,不会在半夜三点接到老板的电话说“用户抱怨网站无法访问”。证书管理是一个重要技能,在实际工作中会非常有用,特别是当你计划从事大规模Web应用部署或DevOps工程时。
GO TO FULL VERSION