Certbot之仅申请证书、在内网中申请证书、DNS01

原文地址:Certbot之仅申请证书、在内网中申请证书、DNS01(永久地址,保存网址不迷路 🙃)

问题描述

在申请证书时,我们按照 Certbot 官方指引,需要公网服务器,并且 HTTP 站点在线(这主要是为了完成 HTTP 质询,以证明域名所有权)。当证书签发结束后,Certbot 程序将修改 Nginx 配置文件以使用新的证书。整个过程一步到位,开箱即用,非常方便。

但是存在特殊场景:我们站点在内网,未对外公开,这样便无法完成 HTTP 质询,就无法进行签发证书;我们的 Web server 未受到 Certbot 的支持,因此无法自动修改配置文件,需要我们仅申请证书,然后自行修改配置文件。总之,这些特殊场景的存在,需要我们仅申请证书,而不能使用 Certbot 的自动化配置。

该笔记将记录:在 Certbot 中,仅申请证书的方法,以及相关问题的处理、解决方案。

解决办法

除了 HTTP 质询,我们还能使用 DNS 质询方法:
1)在申请证书时,根据要求添加 DNS 记录;
2)然后 Let's Encrypt(ACME Server)检查该记录,以验证域名的所有权;
3)在检查通过后,进行证书签发,并自动保存在服务器中;
4)最后,我们修改 Web server 配置,以使用该证书文件;

第一步、开始申请证书

执行如下命令开始申请证书,按照提示操作即可:

certbot certonly --manual --preferred-challenges dns -d example.com

第二步、添加解析记录

当命令执行中,会收到类似如下提示,要求添加 TXT 解析记录:

Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

667drNmQL3vX6bu8YZlgy0wKNBlCny8yrjF1lSaUndc

Once this is deployed,
Press ENTER to continue

根据上面提示,登录云商后台(比如阿里云、腾讯云等等),添加名为 _acme-challenge.example.comTXT 记录,并使用 667drNmQL3vX6bu8YZlgy0wKNBlCny8yrjF1lSaUndc 作为记录值。

注意事项:
1)由于 DNS 记录不会马上生效,所以稍后再按回车键。
2)使用 dig +short -t txt _acme-challenge.example.com 命令验证 DNS 是否生效。

第三步、按下回车键

在确认 DNS 记录生效之后,按下回车键将会收到证书申请成功的提示(类似如下内容):

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2020-03-11. 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

第四步、使用证书

正如开始所述,该方法只能申请证书,我们还需要手动修改 Web server 配置文件,以使用证书。这里不再展开。

证书文件路径:输出日志包含证书路径,这里是 /etc/letsencrypt/live/example.com/ 目录

关于证书自动续期

证书有效期为 90 天,需要在定时任务中使用 certbot renew 命令重新续期证书,但是需要附加操作,参考 +manual plugin is not working 笔记。

改进:完成 DNS 质询的简便方法

每次进行 DNS 质询,我们都需要绑定 TXT 记录。当质询完成后,我们还应该清理这些 TXT 记录。

这事件繁琐的事情,但是已存在解决方案:命令 certbot 提供 Auth Hook 选项,以传入自定义脚本。在执行质询前,会调用这些自定义脚本。既然如此,我们便可在脚本中调用云商的 API 来添加 TXT 记录。同时支持 Cleanup Hook 选项,也是传入自定义脚本,以在质询完成后调用(清理工作)。

这些调用云商的脚本已经有人实现(比如 certbot-letencrypt-wildcardcertificates-alydns-auacmesh-official/acme.sh 等等),我们借用即可(内心表示感谢,也暗自窃喜,行动上 Star Watch 走一波)。我们选用 certbot-letencrypt-wildcardcertificates-alydns-au 提供的脚本,完全是因为公司已经在使用,而我们又无必付出额外的精力去学习新的工具(无需求,则无必要)。

证书申请

1)安装 certbot 命令,参考 Certbot Installation 笔记;
2)配置并使用脚本:

git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au /srv/certbot-script/
cd /srv/certbot-script/
chmod u+x ./au.sh

# 我们使用腾讯云 DNS 服务,需要填写相应的 Secret 信息(参考 ./au.sh 说明)
vim ./au.sh
# TXY_KEY="AKIDC......."
# TXY_TOKEN="3pLabL...."

# 运行命令进行测试(--dry-run)
certbot certonly  -d '*.k4nz.com' -d 'k4nz.com' \
    --manual --preferred-challenges dns \
    --dry-run  \
    --manual-auth-hook "/srv/certbot-script/au.sh python txy add" \
    --manual-cleanup-hook "/srv/certbot-script/au.sh python txy clean"
    
# 当测试成功后,去掉 --dry-run 选项来申请证书
certbot certonly  -d '*.k4nz.com' -d 'k4nz.com' \
    --manual --preferred-challenges dns \
    --manual-auth-hook "/srv/certbot-script/au.sh python txy add" \
    --manual-cleanup-hook "/srv/certbot-script/au.sh python txy clean"
    
// 证书 /etc/letsencrypt/live/k4nz.com/ 目录,接下来便可配置 Nginx 或者其他 Web server 来使用我们新申请的证书。

// 选项 -d 指定我们需要申请证书的域名,它们将合并在同一张证书中

证书手动续期

续期全部证书:

certbot renew \
    --manual --preferred-challenges dns \
    --manual-auth-hook "/srv/certbot-script/au.sh python txy add" \
    --manual-cleanup-hook "/srv/certbot-script/au.sh python txy clean"

续期单张证书:

certbot-auto certificates

certbot renew \
    --cert-name "Your Certificate Name" \
    --manual --preferred-challenges dns \
    --manual-auth-hook "/srv/certbot-script/au.sh python txy add" \
    --manual-cleanup-hook "/srv/certbot-script/au.sh python txy clean"

证书自动续期

用于证书需其的定时任务:

cat >> /srv/certbot-script/crontab.sh <<EOF
# 我们沿袭 Certbot 官方的写法
/srv/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' \
certbot renew \
    --manual --preferred-challenges dns \
    --manual-auth-hook '/srv/certbot-script/au.sh python txy add' \
    --manual-cleanup-hook '/srv/certbot-script/au.sh python txy clean' \
    --post-hook 'systemctl reload nginx'
EOF

chmod u+x /srv/certbot-script/crontab.sh

echo "0 0,12 * * * root /srv/certbot-script/crontab.sh" >> /etc/crontab

附加说明

在腾讯云中,如果 HTTP 站点的域名没有备案,则在使用 HTTP 质询时会失败(因为未备案的 HTTP 站点会被重定向)。此时(1)可以使用 DNS 质询,只申请证书,(2)然后在使用 --nignx 或者其他选项,对于已经存在的证书,他会提示你安装证书。

注意事项:如果想删除 apt-get 安装的 certbot 命令,使用 apt-get purge certbot 将清除在 /etc/letsencrypt/ 创建的证书。

参考文献

Linux command to inspect TXT records of a domain
Let's Encrypt Server Certificate via DNS Challenge
How to use Let's Encrypt DNS challenge validation?
ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值