You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android/Java开发中HTTPS请求sslSocketFactory单参数方法废弃的解决方案

替代方案

已废弃的单参数sslSocketFactory(javax.net.ssl.SSLSocketFactory)需替换为双参数重载方法sslSocketFactory(SSLSocketFactory, X509TrustManager)。

官方废弃说明:该方法废弃原因是SSLSocketFactory不会对外暴露自身的X509TrustManager,而OkHttp需要该字段来构建完整的证书链,调用该方法时必须通过反射提取信任管理器,应用应当优先调用双参数方法以避免反射操作。该方法用于设置保障HTTPS连接安全的套接字工厂,若未手动配置则会使用系统默认值。

代码修改实现

你当前的trustCert方法仅返回SSLContext,需要调整逻辑提取出X509TrustManager实例,再传入方法即可,修改后的完整代码如下:

// 提前获取SSLSocketFactory和X509TrustManager实例
SSLSocketFactory sslSocketFactory = null;
X509TrustManager trustManager = null;
try {
    InputStream is = getApplicationContext().getResources().openRawResource(R.raw.gdig2);
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    Certificate ca = cf.generateCertificate(is);

    String keyStoreType = KeyStore.getDefaultType();
    KeyStore keyStore = KeyStore.getInstance(keyStoreType);
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca);

    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);
    TrustManager[] trustManagers = tmf.getTrustManagers();
    trustManager = (X509TrustManager) trustManagers[0];

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, trustManagers, null);
    sslSocketFactory = sslContext.getSocketFactory();
} catch (CertificateException | IOException | KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) {
    e.printStackTrace();
}

// 构造OkHttpClient时传入双参数
OkHttpClient client;
if (sslSocketFactory != null && trustManager != null) {
    client = new OkHttpClient().newBuilder()
            .sslSocketFactory(sslSocketFactory, trustManager)
            .build();
} else {
    // 异常时降级使用默认HTTPS配置
    client = new OkHttpClient().newBuilder().build();
}

// 后续请求逻辑无需修改
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new FormBody.Builder()
        .build();

Request request = new Request.Builder()
        .url("https://example.com")
        .method("GET", null)
        .addHeader("auth-token", token)
        .addHeader("Authorization", "Bearer " + token)
        .build();
Response response = null;
try {
    response = client.newCall(request).execute();
    String odgovor = response.body().string();
    System.out.println(odgovor);
} catch (IOException e) {
    e.printStackTrace();
}
  • 若你不想拆分原有trustCert方法,也可以修改该方法的返回结构,将SSLSocketFactory和X509TrustManager同时返回即可,核心逻辑无变化。

内容的提问来源于stack exchange,提问作者NikolaStan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:45:03