Android 4 SSL上的改造+ okhttp

yan*_*win 5 android okhttp3

我发现android 4不能与ssl配合使用,尝试通过https与api联系时会导致崩溃

javax.net.ssl.SSLException:SSL握手已中止:ssl = 0xb8dbad20:系统调用期间I / O错误,对等连接重置

这是我从其他类似问题中尝试过的方法:

   if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) {
        try {
            Logger.e("under lolipop");
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, new TrustManager[] { new MyTrustManager() }, new SecureRandom());
            client.sslSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            Logger.e("HTTPS"+ e.getMessage() );
        }
    }
Run Code Online (Sandbox Code Playgroud)

哪个没有影响结果

 if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) {

        try {
            client.sslSocketFactory(new TLSSocketFactory(), (X509TrustManager)trustAllCerts[0])
                    .build();
            Logger.e("SETUP TRUST SSL");
            return client.build();
        } catch (KeyManagementException e) {
            Logger.e("SETUP TRUST SSL Failed "+e.getMessage());

            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            Logger.e("SETUP TRUST SSL Failed "+e.getMessage());

            e.printStackTrace();
        }
    }
    return client.build();

}
final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
    @Override
    public void checkClientTrusted(
            java.security.cert.X509Certificate[] chain,
            String authType) throws CertificateException {
    }

    @Override
    public void checkServerTrusted(
            java.security.cert.X509Certificate[] chain,
            String authType) throws CertificateException {
    }

    @Override
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return new java.security.cert.X509Certificate[0];
    }
} };
Run Code Online (Sandbox Code Playgroud)

这段代码给出了另一个错误:

java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。

无论如何有解决这个问题,我必须支持android 4并使用https,

任何帮助都可以!

Håv*_*sen 10

前一段时间,当我们的后端放弃了对TLS 1.0和1.1的支持时,我在Android 4.4上遇到了类似的问题。我通过使用Google Play服务ProviderInstaller安装新的安全提供程序来解决此问题。

在您的应用程序gradle.build文件中添加

implementation "com.google.android.gms:play-services-auth:16.0.1"
Run Code Online (Sandbox Code Playgroud)

在您的启动活动ProviderInstaller.installIfNeeded()中尽早致电。这是尝试安装提供程序的示例方法:

private static void installGooglePlayServicesProvider(Context context) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //Devices with Android 5.1+ should support TLS 1.x out of the box
        try {
            ProviderInstaller.installIfNeeded(context);
        } catch (GooglePlayServicesRepairableException e) {
            Log.e("ProviderInstaller", "Google Play Services is out of date!", e);
            GoogleApiAvailability.getInstance().showErrorNotification(context, e.getConnectionStatusCode());
        } catch (GooglePlayServicesNotAvailableException e) {
            Log.e("ProviderInstaller", "Google Play Services is unavailable!", e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有关ProviderInstaller的更多信息,请参见Goolge开发人员页面: 使用ProviderInstaller修补安全提供程序。

使用TLS 1.2时,您可能必须强制在某些设备上启用支持。看一下以下acticle及其Tls12SocketFactory实现:在Android 4.4和更低版本上使用TLS 1.2