移动端请求如何确保 HTTPS 加密不被中间人攻击? 程序猿鑫哲 提问于 2026-03-12 17:15:20 阅读 3 移动 我们 App 的 H5 页面通过 fetch 发起 API 请求,虽然用了 HTTPS,但听说还是可能被抓包或中间人攻击。我试过在请求头加自定义 token:headers: { 'X-Token': 'xxx' },但感觉这并不能防抓包。有没有更靠谱的方式?比如证书绑定或者公钥校验? 看到有些资料提到 SSL Pinning,但不确定在纯前端 H5 里能不能实现。现在用的是 Vue3 + Vite,有推荐的方案吗? 我来解答 赞 1 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 晨妍🍀 Lv1 这个问题挺常见的,我先泼盆冷水:纯前端 H5 基本上做不到真正的 SSL Pinning。 SSL Pinning 的原理是把服务器证书或公钥"钉"在客户端,每次请求时校验。但 WebView 里跑的网页没有权限访问系统证书库,也没有 API 来做证书校验。所以网上那些前端实现 SSL Pinning 的方案基本都是半吊子,意义不大。 真正能打的方案就这几个: 方案一:在原生 App 端做证书绑定(最靠谱) 如果你们的 H5 是跑在 App 的 WebView 里,最佳实践是在原生 iOS/Android 那层做证书绑定。iOS 有 NSURLSession 的 challenge 回调,Android 有 OkHttp 的 CertificatePinner,直接在 native 代码里校验证书指纹。H5 本身是防不住的,得靠宿主 App 来保护。 方案二:双向认证(mTLS) 服务器要求客户端也提供证书,双向验证。但这需要 App 内置客户端证书文件,实现成本偏高,一般支付类场景才会用。 方案三:前端能做的有限防护 在 Vue3 里可以加一些检测手段,比如检查是否走了代理、warn 用户当前网络不安全,但这些只能吓唬人,专业抓包工具绑个证书就能绕过。 // 简单检测下是否开了代理(仅作提示) const isProxy = await fetch('/api/health', { method: 'HEAD' }).catch(() => true); if (isProxy) { console.warn('检测到可能存在代理'); } 方案四:后端层面加固 这个比前端靠谱多了——在请求里加签名。比如每次 API 调用带上 timestamp + nonce + signature,服务器校验签名是否合法。即使被抓包,攻击者也很难伪造有效签名。微信支付、支付宝的接口都是这么干的。 总结下: 如果你们能改 App 代码,优先在原生层做证书绑定,这是最直接的。如果只能改 H5,那就靠后端签名 + 前端简单检测凑合着。单纯加个 X-Token 确实防不住专业抓包,token 本身也是明文传输的。 回复 点赞 2026-03-12 17:17 加载更多 相关推荐 2 回答 28 浏览 Charles抓包手机HTTPS请求失败怎么办? 我用Charles调试移动端接口,HTTP请求能正常抓到,但一换成HTTPS就显示SSL handshake failed。手机已经装了Charles的根证书,也信任了,iOS 16系统,设置里证书状... UP主~永香 工具 2026-02-27 14:53:20 2 回答 38 浏览 移动端请求 HTTPS 接口为什么会失败? 我在开发一个移动端 H5 页面,调用后端的 HTTPS 接口时老是失败,控制台报错 net::ERR_CERT_AUTHORITY_INVALID。明明在 PC 浏览器上能正常访问,怎么一到手机上就不... シ广红 移动 2026-02-23 21:45:18 1 回答 73 浏览 Vue移动端HTTPS页面请求http接口导致Mixed Content错误怎么办? 我在开发Vue移动端应用时遇到了HTTPS问题,当页面切换到HTTPS后,调用本地测试接口时控制台报Mixed Content错误。尝试过在nginx配置强制HTTPS,但真机测试还是加载失败。 代码... 子晨的笔记 移动 2026-02-04 17:23:31 1 回答 59 浏览 HTTPS传输中,为什么加密后的数据在后端无法正确解密? 我在做前后端数据加密时遇到个怪问题:AES加密的数据通过HTTPS发送到后端,Java那边解密总报错,明明算法都用的AES-256-CBC... 前端用的是CryptoJS这样加密的: const c... UX慧芳 安全 2026-02-14 09:46:32 2 回答 44 浏览 联邦学习中本地加密数据如何防止中间人攻击? 最近在做前端联邦学习项目,需要加密用户数据后再上传到服务端聚合。我用AES加密数据后再通过HTTPS发送,但测试时发现中间人能通过抓包获取加密密钥。看代码哪里有问题? const crypto = r... 皇甫莉娟 安全 2026-02-13 12:57:28 2 回答 28 浏览 为什么我的Charles配置好了却抓不到手机的HTTPS请求? 我按教程配置了Charles的HTTPS代理,手机也设置了代理并安装了证书,但访问App时请求还是显示“Connection refused”。/* 我在App的WebView里看到的错误样式 */ ... UE丶玉宁 工具 2026-02-10 15:06:31 2 回答 69 浏览 Burp Suite配置HTTPS抓包一直拦截不到请求怎么办? 在用Burp测试网站时,配置了代理和安装CA证书后,HTTP请求能正常拦截,但HTTPS请求就是进不去拦截器,浏览器还提示证书不受信任。我试过清浏览器缓存、重装证书、换8080/8090端口都不行,B... 松奇 安全 2026-02-03 17:13:34 2 回答 44 浏览 Fiddler抓不到HTTPS请求的响应内容怎么办? 用Fiddler调试时发现,发给https://api.example.com的请求在会话里显示为空响应体,明明已经安装了证书。 我写了个测试页面用fetch调用接口:<pre class=&q... A. 新利 前端 2026-01-26 01:25:29 1 回答 9 浏览 前端请求 HTTPS 接口时为啥还会报不安全内容? 我本地开发时用的 HTTP 协议,但调用的是公司测试环境的 HTTPS 接口,结果浏览器控制台一直提示“混合内容:页面通过 HTTPS 加载,但请求了不安全的资源”。可我明明写的是 https 啊,是... Top丶俊锡 安全 2026-03-08 21:36:18 1 回答 25 浏览 Charles抓包为什么看不到本地React开发的HTTPS请求? 我在用 create-react-app 搭建的项目里调用后端接口,本地启的是 https://localhost:3000,但 Charles 完全抓不到这些请求,明明代理已经开了,其他 HTTP ... 极客东旭 前端 2026-03-03 10:45:18
SSL Pinning 的原理是把服务器证书或公钥"钉"在客户端,每次请求时校验。但 WebView 里跑的网页没有权限访问系统证书库,也没有 API 来做证书校验。所以网上那些前端实现 SSL Pinning 的方案基本都是半吊子,意义不大。
真正能打的方案就这几个:
方案一:在原生 App 端做证书绑定(最靠谱)
如果你们的 H5 是跑在 App 的 WebView 里,最佳实践是在原生 iOS/Android 那层做证书绑定。iOS 有 NSURLSession 的 challenge 回调,Android 有 OkHttp 的 CertificatePinner,直接在 native 代码里校验证书指纹。H5 本身是防不住的,得靠宿主 App 来保护。
方案二:双向认证(mTLS)
服务器要求客户端也提供证书,双向验证。但这需要 App 内置客户端证书文件,实现成本偏高,一般支付类场景才会用。
方案三:前端能做的有限防护
在 Vue3 里可以加一些检测手段,比如检查是否走了代理、warn 用户当前网络不安全,但这些只能吓唬人,专业抓包工具绑个证书就能绕过。
方案四:后端层面加固
这个比前端靠谱多了——在请求里加签名。比如每次 API 调用带上 timestamp + nonce + signature,服务器校验签名是否合法。即使被抓包,攻击者也很难伪造有效签名。微信支付、支付宝的接口都是这么干的。
总结下:
如果你们能改 App 代码,优先在原生层做证书绑定,这是最直接的。如果只能改 H5,那就靠后端签名 + 前端简单检测凑合着。单纯加个 X-Token 确实防不住专业抓包,token 本身也是明文传输的。