问题 - 无法在 Android10Platform 上提取信任管理器,sslSocketFactory 是类 com.android.org.conscrypt.OpenSSLSocketFactoryImpl

问题描述 投票:0回答:1

我正在 Android 中使用 Retrofit 进行 SSL 认证。对于 Android 版本 10 及更高版本,我收到此错误:“无法在 Android10Platform 上提取信任管理器,sslSocketFactory 是类 com.android.org.conscrypt.OpenSSLSocketFactoryImpl”。对于下面的 Android 版本 10,我收到响应,但是对于 10 及以上,它不起作用。

代码:

public class Api_Client {

    public static final String BASE_URL = ""; // here i am using my base url (i am not mentioned here)

    public static Retrofit retrofit;
    public static Retrofit getApiClient(Context context) {
        InputStream is = null;
        SSLContext sslContext = null;
        if (retrofit == null) {
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            if (BuildConfig.DEBUG) {
                HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
                // set your desired log level
                logging.setLevel(HttpLoggingInterceptor.Level.BODY);
                builder.addInterceptor(logging);
            }
            CertificateFactory cf = null;
            try {
                is = context.getAssets().open("exapmle.pem"); //certificate in .pem format
                cf = CertificateFactory.getInstance("X.509");
                X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
                KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
                ks.load(null, null);
                ks.setCertificateEntry("alias", cert);
                TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                tmf.init(ks);
                sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, tmf.getTrustManagers(), null);
            } catch (CertificateException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (KeyStoreException e) {
                e.printStackTrace();
            } catch (KeyManagementException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            builder.readTimeout(30, TimeUnit.SECONDS);
            builder.connectTimeout(30, TimeUnit.SECONDS);
            builder.sslSocketFactory(sslContext.getSocketFactory());
            Retrofit.Builder builder1 =
                new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create());
            retrofit = builder1.client(builder.build()).build();

        }
        return retrofit;
    }

}

此代码适用于 Android 10 以下的版本。但对于 Android 10 以上的版本,它不起作用。这个问题有解决办法或者其他方法吗?

android ssl-certificate retrofit trustmanager
1个回答
0
投票

问题已解决。

我们需要使用方法

builder.sslSocketFactory(sslContext.getSocketFactory(), systemDefaultTrustManager());
© www.soinside.com 2019 - 2024. All rights reserved.