使用 Lego 获得 Let’s Encrypt 的 SSL 证书时,我尝试创建一个提供者,其中 lego 命令本身作为 DNS 服务器,并进行 DNS-01 认证。
开始
Lego 是一个用 Go 编写的 ACME 客户端,是获取 Let’s Encrypt 等 SSL 证书的命令行工具。
我做了什么?
Lego 的 DNS-01 认证支持多种 DNS 提供商,但为了应对“没有可用 API 的 DNS 服务器!”的情况,我创建了自我作为 DNS 动作并通过 DNS-01 认证获得 SSL 证书的 selfdns 提供者。
我相信基本上不可能将 Lego 本身作为服务器运行,因此没有提出 Pull 请求,而是将其作为个人的 Fork 版本,没有编写测试代码,仅供个人使用。
这样,即使是没有 API 的 DNS 服务(域名附带的 DNS),通过指向 NS 记录,也可以使用 DNS-01 认证获得 SSL 证书。
因为 Lego 本身要作为 DNS 服务器运行,所以需要确保外部可以访问该 DNS 服务器。
免责声明
这里面提到,该工具仅供个人使用,所以不保证其正常运行。
而且,我并没有仔细查阅 ACME 的规范,只是随便做了做。
使用方法
将 NS 记录指向想要的 DNS
在某个 VPS 服务器(hoge)上想要发布证书,因此将 hoge 服务器的 DNS 指向 NS 记录。
hoge 60 IN A XXX.XXX.XXX.XXX _acme-challenge 60 IN NS hoge.example.jp.
为确保结果如预期,使用 dig 命令进行检查。
$ dig _acme-challenge.example.jp -t ns ;; AUTHORITY SECTION: _acme-challenge.example.jp. 60 IN NS hoge.example.jp. ;; ADDITIONAL SECTION: hoge.example.jp. 60 IN A XXX.XXX.XXX.XXX
准备执行 lego 的服务器的全球 IP
开放 iptables 端口。 因为作为 DNS 服务器运行,所以需要开放 UDP/TCP 的 53 端口。
# iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT # iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
下载修改版的 Lego。
# wget https://github.com/masa23/lego/releases/download/v4.10.0/lego_v4.10.0-1_linux_amd64.tar.gz # tar zxvf lego_v4.10.0_linux_amd64.tar.gz
执行 lego 以发布证书。
为了使其作为 DNS 服务器运行,需指定--dns selfdns
。
因为使用 53 端口,所以需要 root 权限。# SELFDNS_LISTEN_ADDRESS=XXX.XXX.XXX.XXX SELFDNS_SERVER_HOSTNAME=hoge.example.jp ./lego --email <邮箱地址> --domains="*.example.jp" --accept-tos --dns=selfdns run
在
SELFDNS_LISTEN_ADDRESS
中指定执行 lego 的服务器的全球 IP。 在SELFDNS_SERVER_HOSTNAME
中指定执行 lego 的服务器的主机名。
这个主机名将用于响应时的 SOA 记录。
如果没有问题,证书将顺利发布。
.lego/certificates/
追记(2023/02/17)
当在 SELFDNS_LISTEN_ADDRESS
中指定 IPv6 地址后,DNS 服务器将以 IPv6 地址启动。
因此,只要有 IPv6 全球 IP 地址,就可以获取 Let’s Encrypt 的 SSL 证书。
- DNS 注册
hoge 60 IN AAAA 20XX:XX:... _acme-challenge 60 IN NS hoge.example.jp.
- 执行 lego
# SELFDNS_LISTEN_ADDRESS=20XX:XX:... SELFDNS_SERVER_HOSTNAME=hoge.example.jp ./lego --email <邮箱地址> --domains="*.example.jp" --accept-tos --dns=selfdns run
这样,即使没有珍贵的 IPv4 全球 IP 地址,也可以轻松获取 Let’s Encrypt 的 SSL 证书! 我用家庭的弗雷茨的 IPv6 地址就能发布,超方便。