移动端调用getcitydetail API遇HandshakeException证书验证失败求助
解决HandshakeException: CERTIFICATE_VERIFY_FAILED自签名证书错误
一、检查HTTP客户端绕过配置是否正确
以下是主流移动开发框架的正确配置示例:
Flutter 用HttpClient
import 'dart:io'; // 初始化客户端时设置证书回调 HttpClient client = HttpClient(); client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; // 发起接口请求 var request = await client.getUrl(Uri.parse("https://你的API域名/getcitydetail")); var response = await request.close();
Flutter 用Dio
import 'package:dio/dio.dart'; import 'dart:io'; Dio dio = Dio(); dio.httpClientAdapter = HttpClientAdapter()..onHttpClientCreate = (HttpClient client) { client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; return client; }; // 调用接口 var response = await dio.get("https://你的API域名/getcitydetail");
二、Android平台额外配置
- 在
android/app/src/main/res/xml下新建network_security_config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">你的API域名</domain> <trust-anchors> <certificates src="user" /> <certificates src="system" /> </trust-anchors> </domain-config> </network-security-config>
- 在
AndroidManifest.xml的<application>标签中添加配置引用:
android:networkSecurityConfig="@xml/network_security_config"
三、iOS平台额外配置
在ios/Runner/Info.plist中添加App Transport Security配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>你的API域名</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
四、排查其他可能原因
- 确认请求的API域名与证书绑定域名完全匹配,避免域名解析错误
- 检查自签名证书是否过期,或证书格式是否符合设备要求
- 测试时更换设备,排除部分系统安全设置拦截的情况
内容的提问来源于stack exchange,提问作者Vishali S
相关产品推荐
相关产品推荐

