利用CertBot颁发Let's Encrypt证书
JAVA 2021-08-12 17:33 1016
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
发布于 2021-08-12 17:33, 最后修改于2021-09-20 19:48
© 2019 - ZXQ's Diary - zhangxiaoqiang.top