收藏
回答

开发一个微信小程序后端服务时,遇到 HTTPS 连接被重置的问题?

一、项目环境

  • 前端:微信小程序(wx.request / wx.uploadFile)
  • 后端:FastAPI(运行在内网服务,通过 Nginx 反向代理)
  • 云服务器:阿里云轻量应用服务器
  • 域名:腾讯云购买(已解析到服务器)

二、问题现象

在以下两个环境中均出现相同问题:

微信开发者工具 \ 微信真机(iPhone)

请求全部失败,错误如下:

request:fail

errcode:-101

cronet_error_code:-101

error_msg: net::ERR_CONNECTION_RESET

三、关键现象

1️⃣ 使用服务器公网 IP 时,一切正常

在未使用域名,仅使用:http://服务器IP:端口时:

  • 小程序开发者工具正常
  • 真机正常
  • 所有接口可访问

2️⃣ 切换为域名 HTTPS 后,全部失败

使用:https://api2.osbornfind.top后:

  • 微信开发者工具 ❌
  • 微信真机 ❌
  • 所有接口全部失败

3️⃣ 浏览器 / curl 正常

curlhttps://api2.osbornfind.top/返回正常

手机 Safari 访问接口也正常

4️⃣ TLS 验证正常

openssl s_client -connect

api2.osbornfind.top:443

结果:

  • 证书链正常(Let's Encrypt)
  • TLS1.2 握手成功
  • cipher 为 ECDHE-GCM
  • Verify return code: 0 (ok)

5️⃣ 请求未进入 HTTP 层

Nginx access.log:

  • 可以看到浏览器 / curl 请求
  • 没有任何来自小程序的业务请求

说明:请求在 TLS / 网络阶段就被中断

四、当前怀疑

问题仅在:

IP → 域名(HTTPS)切换后出现

怀疑方向:

  1. TLS / SNI / HTTPS 链路兼容问题
  2. 云服务器网络层(轻量应用服务器)对某些 TLS 请求的处理
  3. 微信环境对域名 HTTPS 的特殊要求

五、希望确认的问题并得到解决方案

  1. 腾讯云域名解析是否会影响 HTTPS 连接行为(非 CDN 场景)
  2. 微信小程序访问 HTTPS 时,是否对 TLS 参数或 SNI 有特殊要求
  3. 是否存在云服务器(轻量应用服务器)层面对 TLS 请求 reset 的情况
  4. 该问题是否属于 CDN 需要介入的典型场景

使用 IP 时完全正常,切换为域名 HTTPS 后,小程序(开发者工具 + 真机)全部失败,但浏览器和 curl 正常,且请求未进入 HTTP 层,判断问题发生在 TLS 或网络链路阶段。


万分感谢!

您好,补充排查信息如下。

1. 小程序请求代码

当前项目中,普通接口统一通过 apiUrl(path) 拼接域名,API_BASE_URL 当前配置为 https://api2.osbornfind.topapiUrluploadUrl 的实现如下:apiUrl(path) 返回 API_BASE_URL + pathuploadUrl(dbPath) 返回 API_BASE_URL + '/' + dbPath

1.1 wx.request 示例

历史详情页请求代码如下,实际项目中首页接口也是同样的 wx.request 调用方式:

wx.request({
  url: apiUrl(`/history/${id}`),
  success: (res: any) => {
    if (res.statusCode < 200 || res.statusCode >= 300) {
      // 省略错误处理
      return
    }

    const data = res.data || {}
    const foodsRaw = data.foods
    const foods = withRatioPercent(foodsRaw)
    const totalKcalRange = data.total_kcal_range || []
    const imageUrl = data.image_path ? uploadUrl(data.image_path) : ''

    this.setData({
      imagePath: imageUrl,
      foods,
      totalKcalRange
    })
  },
  fail: (err) => {
    // 省略错误处理
  }
})

1.2 wx.uploadFile 示例

图片上传识别接口代码如下:

wx.uploadFile({
  url: apiUrl('/analyze'),
  filePath: imagePath,
  name: 'file',
  timeout: 20000,
  success: (res) => {
    // 省略成功处理
  },
  fail: (err) => {
    // 省略失败处理
  }
})

当前上传请求中未额外设置 header,也未使用自定义证书或代理。

2. 最小化可复现示例

代码片段

https://developers.weixin.qq.com/s/yk8Ek1mq8186

当前用于最小复现的请求逻辑可以简化为下面这段:

wx.request({
  url: 'https://api2.osbornfind.top/',
  method: 'GET',
  timeout: 15000,
  success(res) {
    console.log('success', res)
  },
  fail(err) {
    console.log('fail', err)
  }
})

以及上传最小示例:

wx.uploadFile({
  url: 'https://api2.osbornfind.top/analyze',
  filePath: '本地测试图片路径',
  name: 'file',
  timeout: 20000,
  success(res) {
    console.log('upload success', res)
  },
  fail(err) {
    console.log('upload fail', err)
  }
})

目前无论在微信开发者工具还是真机环境,都会报:

request:fail errcode:-101
cronet_error_code:-101
error_msg: net::ERR_CONNECTION_RESET

3. Nginx HTTPS 相关配置

当前 server_name api2.osbornfind.top 的 HTTPS 核心配置如下:

server_name api2.osbornfind.top;

ssl_certificate /etc/letsencrypt/live/api2.osbornfind.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api2.osbornfind.top/privkey.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve secp256r1:secp384r1;
ssl_prefer_server_ciphers on;

location / {
    proxy_pass http://127.0.0.1:8000;
}

这是当前 nginx -T 输出中对应 api2.osbornfind.top 的生效配置。

另外,使用以下命令验证过 TLS 握手:

openssl s_client -connect api2.osbornfind.top:443 -tls1_2 -curves secp256r1

结果显示:

  • TLS1.2 握手成功
  • Cipher 为 ECDHE-RSA-AES128-GCM-SHA256
  • Temp Key 为 prime256v1
  • Verify return code: 0 (ok)

4. 微信公众平台合法域名配置

已确认在微信公众平台正确配置以下三项合法域名,且均为同一域名:

补充说明

  1. 当前问题不只出现在真机,微信开发者工具中也可复现相同报错。
  2. 在未接入域名、直接使用服务器 IP 进行测试时,小程序原先可以正常访问。
  3. 切换为当前域名 HTTPS 后,浏览器和 curl 访问正常,但微信开发者工具与真机都会报 ERR_CONNECTION_RESET
  4. 当前前端所有请求和图片地址均已统一走 https://api2.osbornfind.top,不存在旧域名残留。API_BASE_URL 当前配置如下:export const API_BASE_URL = 'https://api2.osbornfind.top'。 



最后一次编辑于  03-31
回答关注问题邀请回答
收藏

2 个回答

  • 我是小白
    我是小白
    03-31

    ssl证书验证通过不了,小程序比较严格,不想浏览器随便糊弄就行了

    03-31
    有用
    回复
  • 智能回答 智能回答 本次回答由AI生成
    03-31
    有用
    回复 1
    • 砥砺前行
      砥砺前行
      04-01
      已回复在正文编辑中
      04-01
      回复
登录 后发表内容