#使用 certbot 自动签发证书

Certbot 是一个由 Electronic Frontier Foundation(EFF)开发的开源工具,可用于自动获取 SSL/TLS 证书。

直接使用以下命令安装 certbot

sudo apt install certbot

接着就可以使用 certbot 来签发证书了。

如果你的服务器是 Nginx,并且已经将域名解析到了服务器上,其中一个网站的根目录是 /var/www/webroot,假设配置如下:

server {
    listen       80;
    server_name  www.yourdomin.com;
    root   /var/www/webroot;
    
    # 会在这个目录下创建一个 .well-known 目录,用于验证域名所有权
    location ~ ^/.well-known/{
        allow all;
    }
    # end

    location / {
        root   /var/www/webroot;
        index  index.html index.htm;
    }
}

那么就可以使用 certbot 来申请证书了,基本命令如下:

certbot certonly --webroot -w [网站根路径] -d [你的域名] -d [www.你的域名] 
  • certonly 命令表示仅申请证书即可
  • --webroot 表示使用 webroot 方式进行验证,也就是我们的网站根目录,此处就是我们准备好的 /var/www/webroot
  • -d 参数表示要申请证书的域名,可以有多个,多个的话,这个证书就是覆盖这多个域名的

最终需要执行的命令以及输出如下:

certbot certonly --webroot -w /var/www/webroot -d www.yourdomin.com -d yourdomin.com
# 如果成功,输出如下:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for yourdomin.com
Using the webroot path /var/www/webroot for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/yourdomin.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/yourdomin.com/privkey.pem
   Your cert will expire on 2024-04-25. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - 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

此时,证书已经申请好了。

上面输出中需要注意的是,证书的输出路径,如下:

 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/yourdomin.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/yourdomin.com/privkey.pem
   Your cert will expire on 2024-04-25. To obtain a new or tweaked

上面打印了证书和私钥的路径,关于 letsencrypt 申请的证书,这里有一个要点:

  • 有效的 fullchain.pem 始终是在 /etc/letsencrypt/live/[你的域名]/fullchain.pem
  • 有效的 privkey.pem 始终是在 /etc/letsencrypt/live/[你的域名]/privkey.pem

接下来你可以将证书配置给你的nginx网站了。更改 nginx 配置,新增 ssl 的配置,完整版如下:

server {
    listen       80;
    listen       443 ssl http2;
    server_name  www.yourdomin.com yourdomin.com;
    root   /var/www/webroot;

    #证书文件名称
    ssl_certificate /etc/letsencrypt/live/yourdomin.com/fullchain.pem; 
    #私钥文件名称
    ssl_certificate_key /etc/letsencrypt/live/yourdomin.com/privkey.pem; 
    ssl_protocols TLSv1.2 TLSv1.3; 
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256';
    ssl_session_tickets      on;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=5184000"; # 60d
    
    # 一键申请SSL证书验证目录相关设置
    location ~ ^/.well-known/{
        allow all;
    }

    location / {
        root   /var/www/site1;
        index  index.html index.htm;
    }
}

如果只是为了用,下面内容可以不用了解。

相关配置解释如下:

  • listen 443 ssl http2 监听 443 端口,并启用 http2
  • ssl_certificate 证书文件路径
  • ssl_certificate_key 证书私钥路径
  • ssl_protocols 支持的协议,现在认为安全的是TLS 1.2 和 TLS 1.3,更早的版本已经不推荐使用。
  • ssl_ciphers 配置服务器支持的加密套件,上面的配置是GPT推荐的平衡安全性和兼容性的值。
  • ssl_session_tickets 会话票据(服务端提供给客户端的),开启可以提供重复连接的效率,关闭则更安全。
  • ssl_prefer_server_ciphers 配置服务器将优先使用自己的加密套件
  • ssl_session_cache shared:SSL:10m 表示所有 worker 进程共享一个 10 分钟的缓存。
  • ssl_session_timeout 配置 SSL 会话的超时时间,此处为 10 分钟。
  • add_header Strict-Transport-Security "max-age=5184000" 表示启用 HSTS,强制客户端只使用 HTPPS 和服务端通信, 后面给了一个60天的配置,表示这段时间内,客户端都将使用 HTTPS 连接。

#不使用 nginx

如果你不使用nginx,则无需上面的步骤,但需要保证你的 80 端口没有被占用。

此时可以直接使用 certbot 来申请证书。

命令如下

certbot certonly --standalone -d [你的域名]

解释:

  • certonly 命令表示仅申请证书即可
  • --standalone 表示使用 standalone方式进行验证,这个方式下,是 certbot 自己启动了一个 webserver 来自我证明从而申请证书。
  • -d 参数表示要申请证书的域名,可以有多个,多个的话,这个证书就是覆盖这多个域名的

成功的话,也会打印出成功消息和证书路径

  • 有效的 fullchain.pem 始终是在 /etc/letsencrypt/live/[你的域名]/fullchain.pem
  • 有效的 privkey.pem 始终是在 /etc/letsencrypt/live/[你的域名]/privkey.pem

#配置证书自动更新

上面使用 certbot 工具申请的 letsencrypt 证书,有效期是90天,我们需要到期自动续签。如果不续签的话,在90天后,会因为证书过期,出现网站无法访问的情况。

此时就需要一个定时任务来定期检查并更新证书。

在 Linux 上只需要一个定时任务即可,我们使用 crontab 来创建一个 renew 任务就能实现了。

# 编辑定时任务 如果是首次,会询问使用什么编辑器来编辑,推荐使用默认的 nano 相比 vi vim 操作简单
crontab -e

# 新增更新证书的任务 将下面这几行拷贝到正在编辑的文件中即可
# 更新证书 凌晨3点 每3天执行一次
0 3 */3 * * /usr/bin/certbot renew --force-renewal
# 重载或重启相关服务 3点10分 每3天执行一次 证书如果更新了 需要重启下nginx 或者 gost 的容器
10 3 */3 * * /usr/sbin/nginx -s reload  #如果你把证书配置给了 nginx 则需要重载配置,确保nginx加载使用新的证书

然后 Ctrl + X 退出,保存,定时更新证书的任务就配置好了。

上面的核心是 certbot renew --force-renewal ,其作用时检查并更新证书,当证书有效期小于 30 天时会自动续签新的证书。

此处需要注意,无论你申请了多少证书,这个定时任务只用配置一次,每次更新时会检测所有证书。

如果你不能确定你配置能不能正常 renew 新证书,可以使用如下命令测试。

certbot renew --dry-run

--dry-run 的作用是仅模拟作测试不会真的更新和续签证书。

#如何撤销签发的证书

为什么需要撤销呢?

如果不清理掉,所有签发的证书的配置文件还在,定时任务一直会跑,而我们的网站已经切到新的域名上了,老域名的证书申请配置大概率是无法正确续签的,这将导致续签失败。 这即是对 letsencrypt 资源的浪费,也会导致我们被限制,从而影响正在使用的域名的证书的续签。

使用 certbot certificate 可以查看已经颁发的证书

# 查看已经颁发的证书 会列所所有的证书
certbot certificate

如果你确定不用了要撤销的话,只需要 使用 certbot revoke --cert-name [你的域名] 命令即可。

如果你是域名年抛,需要更换域名,但是又不记得之前的签发配置的话,可以查看颁发的配置文件。

# 此目录下有配置文件
ls /etc/letsencrypt/renewal/
# 查看配置文件
cat /etc/letsencrypt/renewal/[你的域名].conf

把配置记下来之后,就可以放心的撤销,并重新签发了。

#使用微林申请证书

微林(www.vx.link) 这个网站提供了一种与众不同的证书申请方式,它不需要需要你在自己的服务器上运行任何脚本,只需要你在你的域名解析出添加一个 cname 记录即可。

在添加之后,你就可以直接在这个网站上为这个域名签发的证书了。

vx-ssl
vx-ssl

如上图,只需要输入你的域名,然后点击申请即可,完成之后即可得到域名证书的下载地址,接着你可以参考上面的教程将其配置自己的 nginx 上,官方也提供了自动化更新证书的脚本,可以官网自取。不想在服务器上运行脚本的话,也可以每3个月去网站手动点一次。