SSL证书自动获取

neevop 三月 8, 2025

什么是certbot

certbot 是一个开源的自动获取SSL证书的工具。自从免费证书有效期降至3个月,感觉每隔一段时间就会被阿里/腾讯等DNS服务证书服务到期的短信提醒硬控。特别恶心的是这些大厂提供的免费证书还限制每年50个,对于我这种喜欢折腾的站点的穷鬼用户来说,证书焦虑就这么水灵灵的出现了。

然而,当你接触到certbot这个工具后,这个焦虑可以被完全治愈。只需要花几分钟了解一下部署的基础步骤,你就可以重获SSL证书自由。

说明:本文档仅限于个人实践记录,推荐你从官方文档里获取更加完整的介绍。

安装certbot

certbot官方推荐了docker/pip安装方案,我优先尝试了docker方案,由于我的nginx是直接安装在公网站点系统里的,在验证站点的时候,需要特殊的处理才可以实现。因此我放弃了这种方案,采用了pip方案。安装步骤可以参考:certbot用户文档

以下是我的安装步骤,建议在根域名指向的站点进行如下安装和配置。因为在配置插件的过程中,工具需要验证域名归属。

# 如果系统下没有python3,请按需安装
apt install libaugeas0

# 创建一个python虚拟环境,专门用于安装certbot. 如果不是root用户,可能需要加sudo, 下同。
python3 -m venv /opt/certbot/

/opt/certbot/bin/pip install --upgrade pip

/opt/certbot/bin/pip install certbot certbot-nginx

ln -s /opt/certbot/bin/certbot /usr/bin/certbot

至此,已经初步完成了certbot工具的安装,接下来配置nginx插件

certbot --nginx

# 完成配置后,会在你的系统下生成文件 fullchain.pem  privkey.pem
ls /etc/letsencrypt/live/yoursite.com

获取并安装证书

完成配置后,即可通过命令生成子域名SSL证书,一般生成的证书有效期为3个月。

certbot certonly -d dev.yoursite.com -n --nginx

# 等待成功执行后,会在系统中生成对应的证书文件
ls /etc/letsencrypt/live/dev.yoursite.com/
# README  cert.pem  chain.pem  fullchain.pem  privkey.pem

文件中fullchain.pemprivkey.pem即nginx加密需要的证书文件,将它们配置到你的nginx配置文件中

server {
    listen 443 ssl;
    server_name dev.yoursite.com;

    ssl_certificate /etc/letsencrypt/live/dev.yoursite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dev.yoursite.com/privkey.pem;
    
    ...
}

完成证书配置后,检查配置有效,即可生效使用了。

# 检查nginx配置是否正常
sudo nginx -t

sudo systemctl daemon-reload

sudo service nginx restart

# 完成nginx服务重启后,检查下服务状态是否正常
sudo service nginx status

更新

更新主要涉及certbot工具本身和证书的更新。官方建议定期更新certbot工具,毕竟涉及安全,定期更新是很有必要的。

/opt/certbot/bin/pip install --upgrade certbot certbot-nginx

更新证书可以利用工具官方提供的命令行certbot renew,命令会自动检查当前托管的所有证书到期时间,然后进行必要更新,默认的更新时间是2个月。

$ certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Python 3.8 support will be dropped in the next planned release of Certbot - please upgrade your Python version.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/xxx.yoursite.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Certificate not yet due for renewal
...

此处证书更新后,需要手动重启nginx服务,应用证书。