利用CertBot颁发Let's Encrypt证书

JAVA  2021-08-12 17:33  138  

Let's Encrypt提供免费https证书,可通过certbot进行在线证书颁发,颁发时需认证域名所有者,可通过webroot、txt解析方式认证

Webroot

webroot方式即CertBot通过访问颁发证书的服务器的以下路径

example.com/.well-known/acme-challenge/xxx, 进行授权认证,其中xxx为certbot随机生成的值,生成在/data/letsencrypt (可通过-w 参数指定),因此使用docker时需要将/data/letsencrypt挂载至宿主机,并配置允许nginx访问该内容,注意若nginx的/路径已经配置其他服务,应该将/.well-know配置在该server下,否则路径匹配不会成功

server {
        listen 80;
        server_name zhangxiaoqiang.top www.zhangxiaoqiang.top;

        root /usr/share/nginx/html;
        index index.html;

        location / {
            proxy_pass http://172.16.1.80:8080/;
        }
        location ^~ /.well-known {
                alias   /home/certbot/au/.well-known;
        }

    }

命令如下:

docker run -it --rm --name certbot  -v "/home/certbot:/etc/letsencrypt"  -v "/home/certbot:/var/lib/letsencrypt" -v "/home/certbot/au:/data/letsencrypt" -v "/home/certbot/log:/var/log/letsencrypt"  certbot/certbot certonly  -d a.zhangxiaoqiang.top --agree-tos -m 1711764827@qq.com --webroot -w  /data/letsencrypt -v

其中:

-d 用于指定生成证书的域名

--webroot:验证方式使用webroot

--agree-tos:同意他的协议

-w/--webroot-path:站点目录,即生成xxx认证文件的路径,这个路径为容器中的路径,请注意宿主机nginx配置,不正确配置宿主机nginx将无法访问认证文件导致认证失败

-m:邮箱,证书过期了会通知到该邮箱

TXT

txt方式认证支持生成泛解析域名的证书,及域名颁发给*.example.com,首先在这里选择certbot官方提供的对应的解析服务商文档:https://certbot.eff.org/docs/using.html#dns-plugins

利用certbot官方提供的docker镜像自动配置cloudflare的txt解析,去这里寻找你对应的域名DNS解析商的docker镜像:https://hub.docker.com/u/certbot/

按照官方文档,去解析服务商生成一个secreat或者api-token,这里以cloudflare为例,官方说明如下:

https://certbot-dns-cloudflare.readthedocs.io/en/stable/

命令如下:

docker run -it --rm --name certbot  -v "/home/certbot:/etc/letsencrypt"  -v "/home/certbot:/var/lib/letsencrypt" -v "/home/certbot/au:/data/letsencrypt" -v "/home/certbot/log:/var/log/letsencrypt"  certbot/dns-cloudflare certonly  -d *.zhangxiaoqiang.top --agree-tos -m 1711764827@qq.com --preferred-challenges dns --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini --server https://acme-v02.api.letsencrypt.org/directory

其中:

--preferred-challenges dns 指定使用dns方式验证域名所有者

--dns-cloudflare 指定解析服务商是cloudflare

--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini  指定包含secret文件,解析服务商不同参数名也不同,注意docker 挂载, secret在解析服务商生成

--server https://acme-v02.api.letsencrypt.org/directory  颁发泛解析域名需要指定这个server,默认的server只能颁发单个域名的证书

颁发成功后证书会在容器/etc/letsencrypt/live对应的域名文件夹中,请对应查看宿主机位置


注Let's Encrypt限制了每个域名颁发证书频率,调试时可加上 --dry-run 参数使用官方提供的测试环境颁发证书

官方说明如下:https://letsencrypt.org/zh-cn/docs/rate-limits/

可以写一个脚本定时重新颁发证书,后面再研究

crontab -e放入以下内容添加 0 3 */7 * * /home/docker/certbot/autorenew.sh > /home/docker/certbot/log 表示从今天开始每隔7天晚上3点执行任务

autorenew.sh脚本内容如下

#!/bin/bash

rm -rf /etc/nginx/cert/live/
rm -rf /etc/nginx/cert/archive/
docker run --rm --name certbot  -v "/etc/nginx/cert/live/:/etc/letsencrypt/live/" -v "/etc/nginx/cert/archive/:/etc/letsencrypt/archive/"  -v "/home/docker/certbot/cloudflare.ini:/cloudflare.ini"  certbot/dns-cloudflare certonly  -d *.zhangxiaoqiang.top --agree-tos -m 1711764827@qq.com --preferred-challenges dns --dns-cloudflare --dns-cloudflare-credentials /cloudflare.ini --server https://acme-v02.api.letsencrypt.org/directory --no-eff-email
sleep 100s
nginx -s reload

这里注意不能使用交互模式运行容器(-it), crontab计划任务是无法进入任何终端的


参考资料:

https://certbot.eff.org/docs/using.html?highlight=webroot#webroot

https://www.cnblogs.com/txb1989/p/13079961.html

https://www.jianshu.com/p/1eb7060c5ede?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation



https://www.cnblogs.com/jpfss/p/10232980.html


发布于 2021-08-12 17:33, 最后修改于2021-09-20 19:48