使用 CertBot 自动更新 Let's Encrypt SSL 证书

首次申请

下载安装 CertBot

# 下载 CertBot 脚本到当前目录,假设当前文件夹为 ~ 目录
wget https://dl.eff.org/certbot-auto
# 为 CertBot 脚本增加执行权限,# a 为 all 简写,x 为 execute 简写,a+x 表示所有用户及群组的可执行权限
chmod a+x ./certbot-auto

配置 pip 国内源

注:若之前已配置,请跳过此步骤;此步骤的目的是加速 CertBot 下载 python 模块的速度

# 新建 .pip 文件夹并进入
mkdir .pip && cd .pip
# 创建 pip.conf 文件
vi pip.conf
# 在 pip.conf 文件中输入以下内容
[global]
index-url=http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
# 保存退出

运行脚本,安装依赖

./certbot-auto --help

配置 nginx

目的:获取域名证书过程中, Let's Encrypt 会对域名发起访问,以确认申请者对域名的所有权;故需要配置 nginx,以便能够对 Let's Encrypt 的访问返回正确的响应;

# 创建文件夹,用于  Let's Encrypt 访问时返回响应内容
mkdir /home/letsencrypt
# 打开 nginx 配置文件进行编辑,此处假设 nginx 的配置文件在以下路径:/usr/local/nginx/conf/nginx.conf,如不是,则相应修改路径
vi /usr/local/nginx/conf/nginx.conf
// 在 nginx 配置文件中,找到 http 下监听 80 端口的 server
http {
    //...(略)...
    server {
        listen 80;
        
        // 添加如下内容,此处假设申请域名为 www.helloworld.com,请修改为实际申请的域名
        server_name  www.helloworld.com;
        location ^~  /.well-known/acme-challenge/ {
            defaulf_type "text/plain";
            root  /home/letsencrypt/;
            }
            
        // ......以下略......

重启 nginx

# 此处假设 nginx 可执行文件在路径 /usr/local/nginx/sbin 下面,如不是则相应修改路径
# 先使用 -t 参数测试配置文件格式是否正确
/usr/local/nginx/sbin/nginx -t
# 若正确,屏幕上将显示以下字样
> nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
# 重启 Nginx
/usr/local/nginx/sbin/nginx -s reload

运行脚本,申请证书

在申请证书前,记得先将域名的 DNS 解析指向当前的服务器 IP,这样 letsencrypt 机构在向域名发起连接请求的时候,才能路由到当前设置的机器

# 此处为域名 www.helloworld.com 申请一张证书,其中的 youremail.com 请替换为你自己的邮箱地址
./certbot-auto certonly  --email youremail.com --webroot -w /home/letsencrypt -d www.helloworld.com
# 如果要为多个子域名(如 api/test/www) 申请一张证书,则相应修改命令如下
./certbot-auto certonly --email youremail.com --webroot -w /home/letsencrypt -d api.helloworld.com -d test.helloworld.com -d www.helloworld.com

申请成功后,界面下会有如下的成功提示:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/helloworld.com/fullchain.pem. Your cert
   will expire on 2019-08-26. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again......

配置 nginx,启用证书

// 在 nginx 配置文件中,找到 http 下监听 443 端口的 server
http {
    //...(略)...
    server {
        listen 443 ssl;
        
        // 修改 server_name、ssl_certificate、ssl_certificate_key 三个字段的值
        // 此处假设申请域名为 www.helloworld.com,请修改为实际申请的域名
        server_name  www.helloworld.com;
        ssl_certificate      /etc/letsencrypt/live/www.helloworld.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/www.helloworld.com/privkey.pem;
        
        // ......以下略......

当用户访问非加密的 80 端口时,如果需要让服务器自动跳转到 443 端口使用证书的 https 访问,则可以在 http 下 80 端口的 server 中增加如下内容:

// 在 nginx 配置文件中,找到 http 下监听 80 端口的 server
http {
    //...(略)...
    server {
        listen 80;
        server_name  www.helloworld.com;
         
        // 添加如下内容,实现自动跳转
        return 301 https://$server_name$request_uri
        
        // ......以下略......

重启 Nginx,让配置生效

# 此处假设 nginx 可执行文件在路径 /usr/local/nginx/sbin 下面,如不是则相应修改路径
/usr/local/nginx/sbin/nginx -s reload

测试自动更新

# 使用 --dry-run 选项表示测试,非真正执行更新
./certbot-auto renew --dry-run

若显示如下字样,则表示自动更新功能测试成功

Congratulations, all renewals succeeded. The following certs have been renewed:  
   /etc/letsencrypt/live/www.helloworld.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)

到期更新

由于 Let's Encrypt 颁发的证书只有 90 天有效期,因此需要定期进行证书更新

# 手动更新
./certbot-auto renew -v

推荐阅读更多精彩内容