怎样实现DNS服务器自动签发LE证书

2019年10月16日 | 分类: 【技术】

参考:https://wangye.org/blog/archives/1116/

使用BIND9自建服务器的配置,操作具体涉及到三台服务器分别是域名DNS服务器、网站主机服务器、Letsencrypt证书签发服务器,其中DNS服务器安装的是最新版BIND9软件。

1. 配置DNS服务器

首先使用apt更新系统环境:

sudo apt-get update
sudo apt-get upgrade

使用下面的命令生成SHA512 TSIG密钥,此操作可以在home目录下,不需要root权限:

dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST keyname.

(注意keyname.可以任意定义,但是我查阅资料发现名字基本上都有最后那个点)

上面的命令将创建两个形如Kkeyname.+165+XXXXX.key 和 Kkeyname.+165+XXXXX.private文件,这两个文件都是可以直接用cat命令显示出来的,我们需要的是保存于Kkeyname.+165+XXXXX.private的key字段数据,使用grep命令抓取:

grep -e Key Kkeyname.+165+XXXXX.private | cut -d’ ‘ -f2-

这里将生成形如以下的key字符串(每次命令生成的字符串是不同的,这里仅举例说明):

i/KJzuKiYGbWlZ7x3qR6OxXjEX3L8XdeOy90F3aFYtRaGJp/8Ig4HmP/WfG6WsFqoe+a31emvJWeapxmNbnDmA==

由于接下来会多次用到这个key,请记住并复制这个key留作备用。

将key加入我们的BIND9配置,编辑配置文件/etc/bind/named.conf文件,并写入key的配置如下:

key “keyname.” {
algorithm hmac-sha512;
secret “i/KJzuKiYGbWlZ7x3qR6OxXjEX3L8XdeOy90F3aFYtRaGJp/8Ig4HmP/WfG6WsFqoe+a31emvJWeapxmNbnDmA==”;
};

编辑配置文件/etc/bind/named.conf.local,配置DNS区域(zone)如下以启用DNS的动态更新权限(这里以wangye.org为例):

zone “wangye.org” {
type master;
file “/etc/bind/zones/master/db.wangye.org”;

update-policy {
grant keyname. name _acme-challenge.wangye.org. txt;
};
};

增加BIND9对于配置文件的修改权限,因为动态更新是需要BIND9自主更新,如果BIND9没有修改权限,那么动态更新必然会失败,失败消息可以通过日志看到。

chown -R root:bind /etc/bind/zones/master
chmod -R 775 /etc/bind/zones/master

完成上述操作后使用service bind9 restart重启BIND9服务使得DNS生效,至此域名DNS服务器配置结束,接下来需要完成的是网站主机的配置。

2. 托管网站主机配置

这里是网站主机是指运行Ubuntu或者类似Linux系统的主机或者VPS,其中Web服务器软件使用的是nginx,不包括虚拟主机。使用SSH登入网站主机,安装certbot对Letsencrypt证书进行管理:

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

安装插件dns_rfc2136 ,此插件通过dns-01 challenge 实现对DNS服务器上TXT的动态更新(刚才我们BIND9配置过):

sudo apt-get install pip3

如果上面的命令失败的话请尝试下面的命令替代:

sudo apt-get install python3-pip
pip3 install certbot-dns-rfc2136

在/etc/letsencrypt路径下新建配置文件rfc2136.ini,内容如下:

dns_rfc2136_server = 203.119.25.5
dns_rfc2136_name = keyname.
dns_rfc2136_secret = i/KJzuKiYGbWlZ7x3qR6OxXjEX3L8XdeOy90F3aFYtRaGJp/8Ig4HmP/WfG6WsFqoe+a31emvJWeapxmNbnDmA==
dns_rfc2136_algorithm = HMAC-SHA512

值得注意的是上述配置中dns_rfc2136_server配置节所指示的IP地址请替换成你自己的DNS服务器IP地址(之前配置BIND9的那台),dns_rfc2136_name和dns_rfc2136_secret请替换成和刚才BIND9 DNS服务器相同的配置。

假设你的nginx已经配置有可以正常运行的网站且防火墙已经放行TCP 443的端口流量,下面可以申请新的证书了:

sudo certbot certonly –dns-rfc2136 \
–dns-rfc2136-credentials /etc/letsencrypt/rfc2136.ini \
–server https://acme-v02.api.letsencrypt.org/directory \
–agree-tos –no-eff-email \
–domain ‘wangye.org’ –domain ‘*.wangye.org’

最后采用此自动Challenge方式申请证书必然每次续期会修改DNS记录,这个与DNSSEC功能有冲突,如果使用该方式,则需要放弃DNSSEC特性。