尝试创建 Lego selfdns 提供者
服务器
Lastmod: 2023-02-17
Published: 2023-02-16

使用 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 地址就能发布,超方便。