🌐 家庭 IPv6 环境下为内网服务申请 SSL 证书(完整教程)
随着越来越多的运营商支持 IPv6,家用宽带常常自动分配全球可达的 IPv6 地址。这为我们将 NAS、博客、远程桌面等服务从内网暴露到公网提供了可能。
但许多用户在尝试部署 HTTPS 时会遇到阻碍:家用 IPv6 环境下往往无法开启 80/443 端口,导致常规方式无法申请 SSL 证书。本文将介绍如何结合 Cloudflare + DDNS + Certimate + Caddy,实现家庭服务通过自签域名安全访问。
📋 一、准备工作
✅ 拥有一个可控的域名
可在如下平台购买:
- 国内推荐:阿里云、腾讯云
- 海外推荐:Namecheap、Cloudflare Registrar
🌩️ 二、将域名迁移至 Cloudflare
-
注册并登录 Cloudflare
-
添加域名后,Cloudflare 会提示更换你原注册商的 DNS 至 Cloudflare 提供的地址。
-
更改成功后,在 Cloudflare 控制面板中添加 AAAA 记录:
主机名:home 类型:AAAA 内容:你的 IPv6 地址(如 2409:8a00:xxxx:xxxx::1) 代理状态:DNS only(灰色云朵)
注意:不启用 Cloudflare 代理(橙色云朵),否则会影响非 80/443 端口的服务访问。
🔄 三、使用 DDNS-Go 自动更新 IPv6 地址
家庭宽带下 IPv6 地址并不固定,因此我们需要自动同步本机地址到 Cloudflare DNS。
安装 DDNS-Go:
可选择 Docker 或本地运行方式。
本地运行:
wget https://github.com/jeessy2/ddns-go/releases/latest/download/ddns-go-linux-amd64.tar.gz
tar -xzf ddns-go-linux-amd64.tar.gz
./ddns-go
访问控制台:
浏览器访问 http://localhost:9876,配置如下:
- 平台:Cloudflare
- API Token:建议在 Cloudflare 创建,权限包括
Zone.DNS Edit - 域名:如
home.example.com - 更新类型:仅更新 IPv6 地址
DDNS-Go 会自动在后台运行并定期更新 IPv6 地址到 Cloudflare,确保访问永远指向正确的主机。
🔐 四、申请 SSL 证书(Certimate + DNS 验证,Docker 部署)
由于家宽无法开放 80/443 端口,不能使用 HTTP 验证,因此采用 DNS-01 方式申请证书。我们推荐使用 Certimate,并通过 Docker 部署图形界面与命令行两种方式统一管理。
推荐工具:Certimate
Certimate 支持 Cloudflare、阿里云等平台的 DNS API,提供现代化 Web 管理界面和 CLI 工具,适合个人/家庭场景。
🚀 5 分钟部署 Certimate(Docker 方式)
- 拉取并运行官方镜像:
docker run -d \
--name certimate \
-p 8090:8090 \
-v /etc/certimate:/data \
ghcr.io/certimate/certimate:latest serve
- 打开浏览器访问:
http://127.0.0.1:8090
- 登录默认管理员账号:
- 账号:
[email protected] - 密码:
1234567890
登录后请立即前往【设置】页面修改默认密码,并配置 Cloudflare 的 DNS API Token。
📁 证书保存路径
默认情况下,Certimate 会将申请成功的证书保存在 Docker 容器映射目录 /etc/certimate/ssl 下,例如:
/etc/certimate/ssl/home.example.com/cert.pem/etc/certimate/ssl/home.example.com/key.pem
你可以在 Caddy 中直接加载这两个文件作为 TLS 证书使用。
✅ 使用 DNS 验证申请证书
进入 Certimate Web 控制台后:
- 添加域名
home.example.com - 选择验证方式为:DNS(推荐 Cloudflare)
- 填入 Cloudflare 的 API Token 信息
- 点击申请证书,一键获取并安装
🛠️ 可选:命令行模式自动续签
Certimate 也支持 CLI 模式,可以通过 docker exec 调用自动续签逻辑。例如创建定期任务调用以下命令:
docker exec certimate certimate renew \
--dns cloudflare \
--dns-cloudflare-credentials /data/cf_token.json \
-d home.example.com \
--install \
--install-path /data/ssl/home.example.com/
🧭 五、使用 Docker 部署 Caddy 反向代理内网服务(自定义端口)
为了与 Certimate 一致,我们推荐也通过 Docker 部署 Caddy,并挂载证书目录,实现完整容器化。
🧰 准备工作
确保 Certimate 申请的证书保存目录为:
/etc/certimate/ssl/home.example.com/{cert.pem,key.pem}
我们会将该目录通过 Docker 绑定到 Caddy 容器的 /etc/caddy/certs 路径。
📄 创建 Caddy 配置文件(如 Caddyfile):
放在宿主机 /etc/caddy/Caddyfile,内容如下(注意端口为容器内部端口):
home.example.com {
reverse_proxy 127.0.0.1:80
tls /etc/caddy/certs/home.example.com/cert.pem /etc/caddy/certs/home.example.com/key.pem
}
💡
reverse_proxy指向容器或宿主机的服务端口,如服务在主机上运行,建议将主机端口映射为容器内的80。
🐳 启动 Caddy Docker 容器
docker run -d \
--name caddy \
-p 4433:443 \
-v /etc/caddy/Caddyfile:/etc/caddy/Caddyfile \
-v /etc/certimate/ssl:/etc/caddy/certs \
caddy:latest
解释:
-p 4433:443:将外部访问端口改为4433,可配合防火墙或 NAT 设置;-v /etc/caddy/Caddyfile:/etc/caddy/Caddyfile:加载你的反向代理配置;-v /etc/certimate/ssl:/etc/caddy/certs:挂载 Certimate 签发的证书文件目录;
✅ 如果你希望对接其他端口,例如将容器
80映射为宿主8000,可加-p 8000:80,同时反向代理目标也需指向127.0.0.1:80。
🧪 测试访问
服务启动后,访问你的域名和映射端口,如:
https://home.example.com:4433
或配置路由器 / 防火墙转发 443 → 本机 4433,实现标准 HTTPS 访问。
✅ 六、测试访问效果
- 浏览器访问:
https://home.example.com:4433,应显示安全锁标志; - 命令行测试证书是否正常部署:
curl -vk https://home.example.com:4433
也可通过 SSL Labs 测试工具 进一步验证。
🧠 七、进阶建议
| 问题 | 建议解决方案 |
|---|---|
| IPv6 地址经常变化 | 使用 DDNS-Go 持续更新 |
| 家宽封锁 80/443 端口 | 使用 DNS-01 验证获取 SSL 证书 |
| 自动续签证书 | Certimate 支持计划任务(cron 或 systemd timer) |
| 更复杂的反代需求 | 使用 Caddyfile 自定义多个服务路径 |
| 家用设备安全担忧 | 配合 HTTP Auth、IP 访问限制、Cloudflare Tunnel |
🎯 总结流程图
[家庭服务] ← Caddy反代 ← [本机 IPv6地址]
↑
Certimate 获取证书(DNS验证)
↑
Cloudflare DNS ← DDNS-Go 动态更新