OpenWRT环境下无需暴露uhttpd至公网,使用acme.sh续期Let's Encrypt证书的方案咨询
OpenWRT环境下无需暴露uhttpd至公网,使用acme.sh续期Let's Encrypt证书的方案咨询
嗨,针对你的需求,我整理了几个不用修改acme.sh脚本、又能安全续证的实用方案,完美适配你的场景:
方案一:用acme.sh官方自带的端口指定参数(最推荐)
你其实完全不用改脚本!acme.sh的standalone模式支持通过--standalone-port参数指定监听端口,步骤超简单:
- 在OpenWRT防火墙里临时加一条转发规则:把WAN口的80端口转发到路由器本地的8080端口(路由器本身属于LAN网段,这个转发不会让公网流量直接触达uhttpd)
- 执行续证命令时带上端口指定参数,示例:
acme.sh --renew -d your-subdomain.freedns.org --standalone --standalone-port 8080
- 续证完成后记得立刻关闭WAN口的80转发规则。想省事儿的话,还能用acme.sh的钩子脚本自动化整个流程:
--pre-hook:续证前自动添加防火墙转发规则--post-hook:续证完成后自动删除转发规则,比如在hook脚本里调用OpenWRT的uci或fw3命令修改配置并重启防火墙
方案二:临时切换uhttpd端口,让acme.sh临时占用80端口
如果不想搞端口转发,也可以临时调整uhttpd的监听端口:
- 续证前,用uci命令快速把uhttpd的监听端口从80改成其他(比如8080):
uci set uhttpd.main.listen_http='0.0.0.0:8080' uci commit uhttpd /etc/init.d/uhttpd restart
- 临时打开WAN口的80端口,运行acme.sh默认的standalone续证命令(不用改端口,默认监听80)
- 续证完成后,把uhttpd的端口改回80,同时关闭WAN口的80端口
这个流程同样能用hook脚本自动化,避免手动操作忘关端口的风险
方案三:利用uhttpd临时路由规则(备选,不优先推荐)
可以在uhttpd里临时加一条路由规则,把/.well-known/acme-challenge/路径的请求转发到acme.sh的standalone服务,但这样需要让WAN的80流量先到uhttpd,虽然只放行验证路径,但安全性不如前两个方案,所以只作为备选。
额外小贴士
如果你后续不想再折腾HTTP验证,其实可以考虑换个支持免费DNS API的服务商,比如Cloudflare免费版,把你的freedns子域名转到Cloudflare解析,这样就能用acme.sh的DNS验证方式,完全不用开WAN端口,不过这需要迁移域名解析,看你愿不愿意折腾啦。
备注:内容来源于stack exchange,提问作者strubbly




