使用webview_flutter加载HTML文件出现SSL握手失败错误的原因排查
针对使用webview_flutter: ^4.0.2(Flutter 3.7.11稳定版)加载HTML文件时出现的以下错误:
E/chromium(27944): [ERROR:ssl_client_socket_impl.cc(980)] handshake failed; returned -1, SSL error code 1, net_error -101
同时伴随加载耗时、最终仍完成加载的情况,可能的触发原因如下:
HTML包含未信任的HTTPS资源:若本地HTML文件中引用了外部HTTPS资源(如图片、JS脚本、CSS样式表),而资源服务器的SSL证书存在问题(过期、域名不匹配、未被设备根证书库信任),WebView发起SSL握手时会失败。虽然内核可能后续忽略错误继续加载,但握手重试过程会增加耗时。
本地HTML使用HTTPS协议加载:如果通过HTTPS协议而非
file://协议加载本地HTML文件,但未配置有效的本地SSL证书,Chromium内核会发起无效的SSL握手流程,从而触发该错误。设备证书库异常:设备的系统根证书库缺失、损坏或被篡改,导致无法验证合法HTTPS资源的证书,进而触发SSL握手失败。
WebView内核SSL策略限制:
webview_flutter 4.0.2基于的Chromium内核默认禁用了部分旧版SSL协议(如SSLv3)和弱加密算法,若目标资源服务器仅支持这些被限制的协议/算法,会直接导致握手失败。网络环境干扰:网络不稳定、代理服务器拦截SSL握手请求,或防火墙阻断了SSL连接包,会引发
net_error -101(连接失败/重置),进而触发握手失败错误。
内容的提问来源于stack exchange,提问作者Ammar Mohamed

