在 HarmonyOS 的 WebView 开发中,确保通信安全是防止数据泄露和劫持的关键。由于渲染进程与应用进程分离,HTTPS 的校验机制既涉及底层的网络栈,也涉及 ArkTS 侧的拦截回调。
1. 如何做 WebView 的 HTTPS 证书校验?
默认情况下,WebView 会自动验证由系统信任的 CA 机构颁发的证书。但为了应对更高级的安全需求(如私有证书或防御非法颁发的证书),你需要手动干预。
A. 处理证书错误回调
当 WebView 遇到证书过期、域名不匹配或自签名证书时,会触发 onHttpError 或 onSslError 回调。
- 安全准则:严禁在生产环境下直接调用
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)?
结论:支持。
双向认证要求不仅客户端验证服务器,服务器也要验证客户端持有的证书。这在银行、政务等高安全场景中非常常见。
实现步骤:
-
准备客户端证书:将
.p12或.crt证书存放在应用私有目录下(或由服务端动态下发)。 -
监听认证请求:当服务器请求客户端证书时,WebView 会触发
onClientReceive(API 11+) 或通过底层网络配置注入证书。 -
提供凭证:
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中做复杂的证书校验会增加首屏加载时间,建议对核心域名做锁定,对普通域名使用系统校验。