Flutter配置SSL后API响应慢、CachedNetworkImage无法加载HTTPS图片求助
问题分析
你的问题根源出在SSL配置的两个核心错误:
- 修改了全局默认SecurityContext,导致所有网络请求(包括CachedNetworkImage依赖的图片加载库)强制使用你指定的证书,而图片服务器的证书不在信任列表内,因此加载失败。
- 错误混用证书配置:
useCertificateChainBytes用于客户端证书认证(仅当服务器要求客户端提供证书时才需要),如果你的WooCommerce服务器不需要客户端证书,这一步会导致SSL握手反复失败,必须多次重试才可能偶然成功。
正确配置方案
1. 为WooCommerce API创建独立的HttpClient
不要修改全局上下文,只为Woo的请求单独配置SSL,避免影响其他网络操作:
// 单独创建用于WooCommerce请求的HttpClient Future<HttpClient> createWooHttpClient() async { final certificateAsset = await rootBundle.load('assets/WooCertificate.pem'); final certificateBytes = certificateAsset.buffer.asUint8List(); // 创建独立的SecurityContext,而非修改全局defaultContext SecurityContext securityContext = SecurityContext(); // 仅添加信任的根证书(适用于服务器证书为自签或私有CA颁发的场景) securityContext.setTrustedCertificatesBytes(certificateBytes); // 只有当服务器明确要求客户端证书时,才保留下面这行,否则直接删除! // securityContext.useCertificateChainBytes(certificateBytes); // ALPN协议设置先简化,若测试后仍有问题可注释掉,让系统自动协商 // List<String> alpnProtocols = ['http/1.1']; // securityContext.setAlpnProtocols(alpnProtocols, true); HttpClient client = HttpClient(context: securityContext); return client; }
2. 修改API请求代码,使用自定义HttpClient
替换原http.get逻辑,改用自定义HttpClient发起请求,脱离全局配置依赖:
Future<products> getProductByCategory(String catId) async { late products product_List; int maxRetries = 3; // 修复后无需20次重试,3次足够 int currentRetry = 0; final wooClient = await createWooHttpClient(); while (currentRetry < maxRetries) { try { Uri uri = Uri.parse(getOAuthURL( "GET", 'https://engy.jerma.net/wp-json/wc/v3/products?category=' + catId + "&status=publish")); // 使用自定义HttpClient发起请求 HttpClientRequest request = await wooClient.getUrl(uri); request.headers.set("Content-Type", "Application/json"); HttpClientResponse response = await request.close().timeout(Duration(seconds: 12)); if (response.statusCode == 200) { String responseBody = await utf8.decodeStream(response); product_List = products.fromJson(responseBody); break; } } catch (error) { currentRetry++; // 可选:添加延迟重试,避免频繁请求 await Future.delayed(Duration(milliseconds: 500)); } } // 关闭客户端,避免资源泄漏 wooClient.close(); return product_List; }
3. 恢复CachedNetworkImage的正常加载
由于不再修改全局SecurityContext,CachedNetworkImage会使用默认的证书信任机制,只要图片服务器的HTTPS证书是公共CA颁发的合法证书,就能自动恢复加载。若图片服务器也是自签证书,可将其证书合并到你的信任列表,或为图片加载库单独配置SSL上下文。
额外注意事项
- 确认
WooCertificate.pem是根CA证书,而非服务器证书。如果是服务器证书,需转换为PEM格式的CA证书才能正确信任。 - 若服务器不需要客户端证书,务必删除
useCertificateChainBytes代码,这是导致握手失败的核心原因之一。 - 测试ALPN协议:若注释掉ALPN设置后请求正常,说明服务器不支持你指定的协议组合,建议只保留
http/1.1或直接删除ALPN配置,让系统自动协商。
内容的提问来源于stack exchange,提问作者Hassan Ali Hassan
相关产品推荐
相关产品推荐

