前言
sslip.io 提供了免费的 DNS 解析服务,例如 52-0-56-137.sslip.io 解析到 52.0.56.137。因此只要我们拥有公网 IP,就可以利用 ACME 的 HTTP-01 验证方式 申请到免费的 x-x-x-x.sslip.io 的 TLS 证书。
更进一步地,sslip.io 还支持利用 DNS-01 验证 申请泛域名证书。
说明文档:https://github.com/cunnie/sslip.io/blob/main/docs/wildcard.md
使用前提
拥有一个公网IP地址,且能够监听 UDP 协议的 53 端口
操作流程
PUBLIC_IP=$(ip route get 1 | sed -nr 's#.*src ([^ ]*) .*#\1#p')
FQDN=${public_ip//./-}.sslip.io
# 这里监听的是 $PUBLIC_IP:53, 与 systemd-resolve 的默认监听不冲突, 避免端口占用
docker run -d --rm --name wildcard \
-p $PUBLIC_IP:53:53/udp \
-p 127.0.0.1:12345:80 \
cunnie/wildcard-dns-http-server
ufw allow 53/udp
docker run --rm -it \
-e ACCOUNT_EMAIL="admin@example.com" -e ACMEDNS_BASE_URL="http://127.0.0.1:12345" \
-v $PWD/acmesh:/acme.sh --net=host \
neilpang/acme.sh --issue -d $FQDN -d *.$FQDN --dns dns_acmedns
# 清理
docker stop wildcard
ufw delete allow 53/udp
原理
对 _acme-challenge.<xip>.sslip.io 的 DNS 请求被重定向到 <xip>,这是我们实际控制的服务器,因此可以通过所有权验证。
参考资料
https://github.com/cunnie/sslip.io/blob/main/docs/wildcard.md
https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker