7-8.【WebView】如何做 WebView 的 HTTPS 证书校验?如何防止中间人攻击?是否支持双向认证?

0 阅读3分钟

在 HarmonyOS 的 WebView 开发中,确保通信安全是防止数据泄露和劫持的关键。由于渲染进程与应用进程分离,HTTPS 的校验机制既涉及底层的网络栈,也涉及 ArkTS 侧的拦截回调。


1. 如何做 WebView 的 HTTPS 证书校验?

默认情况下,WebView 会自动验证由系统信任的 CA 机构颁发的证书。但为了应对更高级的安全需求(如私有证书或防御非法颁发的证书),你需要手动干预。

A. 处理证书错误回调

当 WebView 遇到证书过期、域名不匹配或自签名证书时,会触发 onHttpErroronSslError 回调。

  • 安全准则:严禁在生产环境下直接调用 handler.handleConfirm()(相当于忽略错误继续访问)。
  • 正确做法:弹出原生对话框提示用户风险,或在检测到异常时直接中止加载。

B. 证书锁定(SSL Pinning)

这是防止中间人攻击的最强手段。通过将服务器证书的公钥 Hash 或指纹硬编码在应用中,确保 WebView 只连接到合法的服务器。

  • 实现方式:在 onInterceptRequest 中拦截请求,利用原生的 rcp (Remote Communication Proxy) 或 http 模块发起带证书校验的同步请求,将结果返回给 WebView。

2. 如何防止中间人攻击(MITM)?

中间人攻击通常利用虚假证书或降级攻击。除了上述的证书锁定,还应配置以下防御策略:

  • 强制 HTTPS (HSTS)

    onInterceptRequest 中检查所有请求,如果发现 http:// 协议,直接修改为 https:// 或拒绝访问。

  • 禁用混合内容(Mixed Content)

    防止在安全页面(HTTPS)中加载不安全的资源(HTTP 图片/脚本)。

    TypeScript

    Web({ src: $rawfile('index.html'), controller: this.controller })
      .mixedMode(MixedMode.None) // 严格模式,禁止混合加载
    
  • 关闭代理探测

    通过原生网络配置,检测系统是否设置了 HTTP 代理(Charles/Fiddler 等抓包工具常用手段)。如果是敏感业务,可以拒绝在代理环境下运行。


3. 是否支持双向认证(Mutual TLS)?

结论:支持。

双向认证要求不仅客户端验证服务器,服务器也要验证客户端持有的证书。这在银行、政务等高安全场景中非常常见。

实现步骤:

  1. 准备客户端证书:将 .p12.crt 证书存放在应用私有目录下(或由服务端动态下发)。

  2. 监听认证请求:当服务器请求客户端证书时,WebView 会触发 onClientReceive (API 11+) 或通过底层网络配置注入证书。

  3. 提供凭证

    TypeScript

    // 伪代码:在证书请求回调中提供本地证书
    onClientReceive(event) {
      const clientCert = getLocalCert(); // 读取本地 p12 证书
      event.handler.confirm(clientCert.path, clientCert.password);
    }
    

4. 安全配置建议表

维度方案风险等级
基础校验系统 CA 自动校验中(易受伪造 CA 攻击)
增强校验SSL Pinning (证书锁定)极高 (防御中间人攻击)
多重身份mTLS (双向认证)最高 (确保客户端合法)
内容安全MixedMode.None高 (防止跨协议劫持)

架构师提示:

  • 证书过期处理:如果使用 SSL Pinning,务必考虑证书到期后的更新机制(如热更新公钥指纹),否则会导致应用大面积无法访问。
  • 性能权衡:在 onInterceptRequest 中做复杂的证书校验会增加首屏加载时间,建议对核心域名做锁定,对普通域名使用系统校验。