Android 4.4 及更低版本上的 SSLHandshakeException

SSLHandshakeException on Android 4.4 and lower

当我想使用 POST 方法连接 Paypal Rest API 时遇到问题。当我不使用 modernhttpclient 时出现错误

The authentication or decryption has failed. 

但是当我使用 modernhttpclient 时,它在 Android API 23(棉花糖)中工作,当我在 Android API 19(设备)和 Android API 16 (模拟器) 我得到了错误

ex {Javax.Net.Ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=…} Javax.Net.Ssl.SSLHandshakeException

根据,我需要使用自定义套接字工厂。但是如何在 HttpClient 或 modernHttpClient 中实现它?

不确定我能否完全回答你的问题,但我会试一试:

如果您分析 Paypal REST API 端点,例如像这样的 SSL Labs https://www.ssllabs.com/ssltest/analyze.html?d=api.sandbox.paypal.com&hideResults=on,您会发现它们仅支持 TLS 1.2 协议。

现在 Android 自 API 级别 16 开始支持此功能,正如您在此处看到的 https://developer.android.com/reference/javax/net/ssl/SSLSocket.html,但默认情况下它是禁用的,并且仅在 API 级别 20 中+ 他们启用了它。

在 Xamarin 论坛中,有人发布了一个解决方案,通过分叉 ModernHttpClient 并添加改进的 SSL 套接字工厂,为 API 级别 16 至 19 的 Android 启用 TLS 1.2:https://forums.xamarin.com/discussion/63005/modernhttpclient-tls-1-2-android-api-19

这应该可以解决 Android 版本的问题,但对 Android 4.1.

之前的版本没有帮助

基本上当服务器端的 SSL 链断开时会出现此问题,服务器需要包含完整的链并包含中间根链,

有关更多信息,请参阅此 link。

https://developer.android.com/training/articles/security-ssl.html

您可以使用 Google Play Services 中的 ProviderInstaller,它将系统 SSL 提供程序替换为 Google:

提供的更新的提供程序

https://developer.android.com/training/articles/security-gms-provider.html

我在应用程序的 onCreate() 中对其进行了初始化,错误消失了。我相信您可以通过 Xamarin 以某种方式做到这一点。

这是由于以下几个原因造成的:

  1. 对于旧版本的 TLS 1.2 支持尚不明确 Android 台设备。
  2. 设备厂商对官方的承诺不一 Android 在他们的设备上运送 TLS 1.2 的规范
  3. 运营商和设备制造商对 为其客户提供软件和安全更新。

您可以为默认未启用 TLS v1.2 的 Android 4.0 设备强制执行

要修复它,请使用以下代码作为异步调用。

    ProviderInstaller.installIfNeededAsync(getApplicationContext(), new 
    ProviderInstaller.ProviderInstallListener() {
                @Override
                public void onProviderInstalled() {
                    SSLContext sslContext;
                    try {
                        sslContext = SSLContext.getInstance("TLSv1.2");
                        sslContext.init(null, null, null);
                        sslContext.createSSLEngine();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onProviderInstallFailed(int i, Intent intent) {

                }
            });

有关更多信息,请使用此参考资料

https://ankushg.com/posts/tls-1.2-on-android/

如果您使用 Picasso 库,请将其更新到最新版本 现在的最后一个版本是: 实施 'com.squareup.picasso:picasso:2.71828' 就这样