Certbot 用 DNS 验证的方式签发泛域名、单域名证书
目录
准备工作
- docker
Makefile
# 参数: 域名,不带 * 号
DOMAIN ?= 'XX.cn'
# 参数: 邮箱
EMAIL ?= 'XX@YY.com'
# 参数: 输出单域名证书的目录名称
SSL_DIRNAME ?= ssl_${DOMAIN}
# 参数: 输出泛域名证书目录名称
SSL_WILDCARD_DIRNAME ?= ssl_wildcard_${DOMAIN}
# 自动拼接泛域名
WILDCARD_DOMAIN = '*.'${DOMAIN}
# Certbot 支持泛域名的服务 URL
CERTBOT_WILDCARD_ACME_SERVER ?= 'https://acme-v02.api.letsencrypt.org/directory'
PWD = $(shell pwd)
# make ssl 签发单域名证书
# 按要求操作,签发完成后,证书保存到本机当前目录
.PHONY:ssl
ssl:
rm -rf ${PWD}/${SSL_DIRNAME} && mkdir ${PWD}/${SSL_DIRNAME} && \
docker run --rm -it \
-v ${PWD}/${SSL_DIRNAME}:/etc/letsencrypt/archive/${DOMAIN} \
certbot/certbot \
certonly \
--preferred-challenges dns \
--server ${CERTBOT_WILDCARD_ACME_SERVER} \
-d ${DOMAIN} \
-m ${EMAIL} \
--agree-tos \
--manual
# make ssl-test 测试签发单域名
.PHONY:ssl-test
ssl-test:
docker run --rm -it \
certbot/certbot \
certonly \
--preferred-challenges dns \
--server ${CERTBOT_WILDCARD_ACME_SERVER} \
-d ${DOMAIN} \
-m ${EMAIL} \
--agree-tos \
--manual \
--dry-run
# make wildcard 签发泛域名证书
# 按要求操作,签发完成后,证书保存到本机当前目录
.PHONY:wildcard
wildcard:
rm -rf ${PWD}/${SSL_WILDCARD_DIRNAME} && mkdir ${PWD}/${SSL_WILDCARD_DIRNAME} && \
docker run --rm -it \
-v ${PWD}/${SSL_WILDCARD_DIRNAME}:/etc/letsencrypt/archive/${DOMAIN} \
certbot/certbot \
certonly \
--preferred-challenges dns \
--server ${CERTBOT_WILDCARD_ACME_SERVER} \
-d ${WILDCARD_DOMAIN} \
-m ${EMAIL} \
--agree-tos \
--manual
# make wildcard-test 测试签发泛域名
.PHONY:wildcard-test
wildcard-test:
docker run --rm -it \
certbot/certbot \
certonly \
--preferred-challenges dns \
--server ${CERTBOT_WILDCARD_ACME_SERVER} \
-d ${WILDCARD_DOMAIN} \
-m ${EMAIL} \
--agree-tos \
--manual \
--dry-run
# make dig 检查 TXT 结果
.PHONY:dig
dig:
dig -t txt _acme-challenge.${DOMAIN}
参数 | 说明 |
---|---|
--preferred-challenges |
指定 DNS 验证作为域名所有者证明 |
--server |
Certbot 服务 URL,泛域名用 https://acme-v02.api.letsencrypt.org/directory |
-d |
待签发的域名 |
-m |
邮箱 |
--agree-tos |
同意服务条款,邮箱会接收续期通知 |
--manual |
DNS验证要等TTL生效,所以要进入命令行交互模式 |
--dry-run |
指定为测试环境,正式环境不能频繁签发,可以用此参数做自动化测试 |
测试签发
DOMAIN='<域名>' EMAIL=<邮箱> make ssl-test
域名 TXT 验证
Certbot 要求在域名解析中设置 TXT 条目为一个随机串。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:
_acme-challenge.XX.cn.
with the following value:
oB8sPkoZ8fOGcAjG7wzce3_u5NT8EWHwYZgKrhZiBss
Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.XX.cn.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
此时在自己域名的供应商中按要求修改 TXT 值。
设置完后,要等记录生效,期间可以用 dig
查看修改后的 TXT 是否生效:
DOMAIN='<域名>' make dig
直到 dig 看到应答结果是刚刚设定的随机串, certbot 端才可以继续签发。
正式签发
直接签发太频繁会被 certbot 禁用一周左右,建议先用测试签发检查会不会出错。
流程同上,直接签发。
DOMAIN='<域名>' EMAIL=<邮箱> make ssl
签发后,当前目录会生成 ssl_<域名>
,里面即是证书。