Flutter WebView加载HTTPS链接时出现SSL握手失败错误
解决Flutter WebView加载HTTPS链接时的SSL握手失败问题
你遇到的E/chromium(13842): [ERROR:ssl_client_socket_impl.cc(983)] handshake failed; returned -1, SSL error code 1, net_error -202错误,本质是SSL/TLS握手过程中证书验证不通过导致的,下面是几个实用的排查和解决方法:
先确认服务器证书的合法性
首先用普通浏览器打开你的HTTPS链接,点击地址栏的锁图标查看证书详情:- 检查证书是否由正规的CA机构颁发,不是自签名证书;
- 确认证书是否在有效期内,域名是否和访问的地址完全匹配;
如果是自签名证书,这就是问题根源——默认情况下WebView会拒绝信任这类未被系统认可的证书。
测试环境下处理自签名证书(生产环境禁用!)
如果是测试环境使用自签名证书,你可以临时配置WebView忽略SSL验证,但绝对不能在生产应用中这么做,会带来严重的安全风险。
以webview_flutter包为例,可以通过证书错误回调来跳过验证:WebView( initialUrl: "你的HTTPS链接", onWebViewCreated: (WebViewController controller) async { if (Platform.isAndroid) { final sslManager = AndroidWebViewSslManager(controller); sslManager.setSslErrorHandler((error, handler) { // 忽略SSL错误,继续加载页面 handler.proceed(); }); } }, // 其他必要配置... )注意:不同版本的
webview_flutterAPI可能略有差异,记得对照你使用的版本调整代码。检查设备系统时间
这个容易被忽略:如果设备的系统时间和实际时间偏差过大(比如差了几个月甚至几年),会导致证书的有效期验证失败。把设备时间调整到当前正确时间后再尝试加载链接。验证WebView的TLS版本兼容性
部分旧版本的Android系统WebView可能不支持服务器使用的高版本TLS协议(比如TLS 1.3),可以检查服务器的TLS配置,确保兼容目标系统版本,或者在应用中配置WebView启用对应TLS版本的支持。
重要提醒:生产环境必须使用由正规CA颁发的有效SSL证书,任何忽略SSL验证的操作都会让用户的通信面临被窃听、篡改的风险,绝对不可取。
内容的提问来源于stack exchange,提问作者Kaan Tomruk




