基于letsencrypt 的免费证书自动续期

安装certbot

以 ubuntu apt 为例 ,如果是 centos 改成 yum,其他参数基本相同。

sudo apt install certbot

测试安装成功:

# certbot --version
certbot 2.9.0

配置 http 80 端口可用的 web server 路径

certbot 在生成证书时,要验证域名归属,所以需要先保证基本的域名可访问,假如想申请 BBB 域名的证书,先保证 BBB 的 http 的网址可访问,并且 web 根目录可正常读写。
对于 nginx 来说就是配置简单的 80 端口,域名和 root path等基本信息就可以,手动测试能访问到根目录下的文件。

生成证书

certbot certonly --webroot -w AAA -d BBB

BBB代表你要支持的域名,一般是子域名,比如 b.bbb.com,AAA是BBB当前已经可以访问的根目录,需要使用绝对路径。

生成成功后,域名路径一般在:

/etc/letsencrypt/live/BBB/fullchain.pem;
/etc/letsencrypt/live/BBB/privkey.pem;

注意:建议不要移动路径,全局使用这个生成的默认路径,因为这个免费证书只有 3 个月的有效期,我们后面还要通过 certbot 续期,默认续期的路径就是这个生成路径。

续期

certbot renew

自动续期

Linux 下,推荐用 cron服务

crontab -e

如果单独更新证书:

30 2 * * * sleep $(($RANDOM \% 600)) && certbot renew --quiet

如果配合 nginx使用,更新证书后,一定要重启 nginx 才能生效,所以需要额外参数:

30 2 * * * sleep $(($RANDOM \% 600)) && certbot renew --quiet --deploy-hook "nginx -s reload"

letsencrypt renew的认证路径

在某些重定向的配置场景中,所有请求都被proxy到了远端服务器,这时候certbot rewew的时候就因为无法远程操控well-known路径导致认证失败。
解决就是在proxy的本地创建认证目录:

# letsencrypt认证目录
location /.well-known/ {
    root  /data/wwwroot/xxx;
}

location /{
    # 其他目录的操作在这里
}

nginx下proxy根路径模式的letsencrypt续期问题

问题

当我们使用letsencrypt时,我们会使用renew来自动续期免费证书,从而实现永久的免费证书使用。

在某些域名的重定向场景,我们通过 location和proxy方式将某一个子域名重定向到新的子域名下。这种情况下我们的https证书一般是挂在原域名下的,但是因为我们是从根域名就重定向了,这就导致letsencrypt在renew过程中验证webroot会失败,因为域名的访问是走proxy路径的。

解决

我们给letsencrypt专门配置一个对应子域名能web访问的路径,并且将配置项放在前面,因为nginx的location是按照顺序匹配的,一旦达成就会退出location过程,所以就实现了对letsencrypt路径专门做映射管理的目的。

letsencrypt的check路径如下:

https://xxx.xxx.com/.well-known/acme-challenge/xxxx

所以我们的nginx location 路径配置如下

location /.well-known/ {
     root  /xxxxx;
}

其中的root路径就是子域名所对应的可访问web本地路径,这个路径是专门为了renew创建的。这样就保证了letsencrypt的renew同时保证了子域名的其他业务路径正常proxy。

修改配置后,切记重启nginx,否则就要该挠头了:)