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
相关产品推荐
相关产品推荐

