【SSL】微信临时ICP未备案风控解除

周店瑟谷 17 阅读 建站与数字基建

恭喜通关!这次的“折腾”非常硬核,完美覆盖了从公网 DNS 解析、内网端口穿透、SSL 证书加密,一直到应用层(Docker)路由和微信生态风控的完整链路。

为了让你今后遇到类似环境(动态 IPv6 家宽 + Cloudflare 代理 + 1Panel/OpenResty + Docker 部署)时能迅速定位问题,我把这次的排障全过程梳理成了一份《自建站内网穿透与排坑实战手册》。建议收藏备用:

核心架构理解

在你排查任何问题前,脑海中必须先有这条数据流的完整路径。任何一个环节断了,都会报不同的错:

访客 ➔ Cloudflare (CF) ➔ 家宽光猫/路由 (防火墙) ➔ 本地服务器 IPv6 ➔ 1Panel (OpenResty/Nginx) ➔ Docker (Node.js/后端)

第一阶段:打通公网连接(解决 522 Connection Timed Out)

表现: 访客能连上 CF,但 CF 连不上你的家里的服务器(请求石沉大海)。

排查与解决思路:

  1. 家宽 IPv6 前缀变化(核心杀手):

    • 现象: 家宽的 IPv6 地址前缀(Prefix)会因为路由器重启或运营商策略定期改变。DDNS-GO 可能抓到了旧 IP,导致 CF 一直在敲一扇不存在的门。

    • 解法: 在 DDNS-GO 中使用正则表达式(如 @1)强制匹配并同步最新有效的公网 IPv6 地址。

  2. 运营商端口封锁:

    • 现象: 家宽默认封死 80 和 443 端口。CF 默认走 80/443,直接被墙。

    • 解法: 在本地 1Panel 改用非标端口(如 666 或 8443)。

第二阶段:搞定 HTTPS 加密握手(解决 525 SSL Handshake Failed)

表现: CF 成功连上了你的服务器端口,但在“对暗号”(验证 SSL 证书)时发现不对劲,直接翻脸掐断连接。

排查与解决思路:

  1. 端口流量引导错误(张冠李戴):

    • 原因: CF 默认去访问你 IPv6 的 443 端口,但你的 1Panel 实际监听的是 666 端口。CF 可能撞上了光猫自带的 443 端口和无效证书。

    • 解法: 在 Cloudflare 开启 Origin Rules(源站规则),强行把请求 blog.xxx.top 的目标端口重写(Rewrite port)为你的非标端口 666。

  2. 本地非标端口“裸奔”(协议错误):通常是这里的问题

    • 原因: 浏览器强制输入 https://IP:666 报协议错误(ERR_SSL_PROTOCOL_ERROR)。因为 1Panel 默认 listen 666; 只处理 HTTP 明文,不认识 HTTPS 加密请求。

    • 解法: 手动修改 OpenResty 站点配置文件,将 listen 666; 修改为 listen 666 ssl http2;,给该端口强行披上加密铠甲。

  3. CF 证书校验太严格:

    • 原因: 在非标端口或自签证书环境下,CF 的“严格”模式极易引发误判。

    • 解法: 在 CF 的 SSL/TLS 设置中,将加密模式从“完全 (严格)”降级为 “完全 (Full)”。

第三阶段:征服微信红名风控(解决“未完成ICP备案”拦截)

表现: 网站配置完美,但由于使用的是海外免实名域名(如 NameSilo 购买),被微信爬虫一刀切拦截。

排查与解决思路(绕过 Docker 路由陷阱):

  1. 常规思维的陷阱:

    • 按照微信提示,将 txt 校验文件放入 Docker 项目的 public 文件夹并重新构建。

    • 致命缺陷 1: 如果 docker-compose.yml 没有做 volumes 数据卷映射,重新构建会彻底清空容器内的历史数据(如上传的视频/图片)。

    • 致命缺陷 2: Node.js(Express等)如果没有明确配置静态目录路由,外网根本无法直接访问(报错 Cannot GET /xxx.txt)。

  2. 终极降维打击(Nginx 原地劫持):

    • 原理: 既然文件放进去读不到,我们干脆不放物理文件了!直接让最外层的 Nginx(OpenResty)在听到这个请求时,原地吐出密码,根本不把请求放行给后端的 Docker。

    • 解法: 在 1Panel 的 OpenResty 配置文件中插入精准匹配规则:

      Nginx

      location = /210b267922fee440e05f580eedec4d32.txt {
          default_type text/plain;
          return 200 "2a105046c67cbe32f91f21caf49a1c1e9f35ad4d";
      }
      
    • 结果: 浏览器瞬间输出纯净的校验码文本,微信认证秒过。

💡 留给未来的“三步排错心法”

以后再遇到网站打不开,不要盲目改配置,按这个顺序做测试:

  1. 查网络层 (断开 WIFI,用手机 5G 测): 直接在浏览器输入 http://[你的最新IPv6地址]:端口。如果不通,说明 DDNS 没更新或防火墙没放行。

  2. 查加密层 (断开 WIFI,用手机 5G 测): 输入 https://[你的最新IPv6地址]:端口。如果报协议错误,说明 Nginx 配置里的 ssl 没写对;如果提示证书不安全但能点继续,说明本地正常。

  3. 查代理层 (切回电脑测域名): 如果 IP 直连正常,但套了域名的 CF 报错,问题绝对出在 Cloudflare 的 SSL 模式(完全/灵活)或者 Origin Rules(端口重写)上。