前言

sslip.io 提供了免费的 DNS 解析服务,例如 52-0-56-137.sslip.io 解析到 52.0.56.137。因此只要我们拥有公网 IP,就可以利用 ACMEHTTP-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

https://github.com/acmesh-official/acme.sh/wiki/dnsapi