NativeScript调用Node服务遇javax.net.ssl.SSLHandshakeException报错求助
看起来你遇到的是Android 4.4(API 19)设备与现代服务器之间的SSL协议兼容性问题,错误提示里的No enabled protocols; SSLv3 is no longer supported已经点明了核心原因:
System.err: javax.net.ssl.SSLHandshakeException: No enabled protocols; SSLv3 is no longer supported and was filtered from the list
KitKat的原生SSL库默认只支持到TLS 1.0,而且现在绝大多数服务器都已经禁用了SSLv3和低版本TLS(比如TLS 1.0/1.1)来符合安全规范,这就导致你的设备和服务器找不到双方都支持的加密协议,握手失败。另外报错里提到的conscrypt是Google Play服务提供的加密库,但KitKat上的版本也无法支持现代TLS协议(比如TLS 1.2+)。
下面是几个可行的解决方案:
1. 配置NativeScript的HTTP客户端支持兼容协议
NativeScript Android底层使用OkHttp作为HTTP客户端,你可以手动配置它启用TLS 1.0和1.1(这是KitKat能支持的最高版本),让服务器和设备有共同的协商基础。
在你的项目中添加如下代码(比如在app.ts或平台特定的初始化文件里):
import { isAndroid } from "@nativescript/core"; if (isAndroid) { // 导入OkHttp相关类 const OkHttpClient = com.squareup.okhttp.OkHttpClient; const ConnectionSpec = com.squareup.okhttp.ConnectionSpec; const TLSVersions = javax.net.ssl.TLSVersion; // 创建自定义连接规范,启用KitKat支持的TLS版本 const compatibleSpec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) .tlsVersions(TLSVersions.TLS_1_0, TLSVersions.TLS_1_1) .build(); // 配置OkHttpClient使用这个规范 const customClient = new OkHttpClient(); customClient.setConnectionSpecs(java.util.Arrays.asList(compatibleSpec)); // 如果使用NativeScript的内置Http模块,需要替换其默认客户端 // 或者直接使用这个自定义client发起请求 }
2. 检查服务器端的SSL配置
如果你的服务器是自己维护的,需要确保它开启了TLS 1.0和1.1的支持(虽然这些协议安全性较低,但这是兼容KitKat的必要妥协)。你可以用在线工具检测服务器的SSL协议支持情况,确认是否包含这两个版本。
3. 评估是否继续支持KitKat设备
从安全性和维护成本考虑,Android KitKat已经停止官方支持多年,绝大多数应用都已经放弃对它的兼容。如果你的用户群体中KitKat设备占比极低,建议直接放弃该版本的支持,这样可以避免安全风险,也不用做上述兼容性配置。
内容的提问来源于stack exchange,提问作者lanette

