参考: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特性。