Skip to main content

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}
certbot 参数说明
参数 说明
--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_<域名>,里面即是证书。