Android 4.4及更低版本的SSLHandshakeException

时间:2016-05-14 04:56:07

标签: android ssl xamarin xamarin.android dotnet-httpclient

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

The authentication or decryption has failed. 

但是当我使用modernhttpclient时它适用于Android API 23(Marshmallow),当我在Android API 19(设备)和Android API 16(模拟器)中测试时,我收到错误

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

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

5 个答案:

答案 0 :(得分:8)

不确定我是否可以完全回答您的问题,但我会尝试一下:

如果您分析Paypal REST API端点,例如使用SSL实验室(例如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之前的版本无法帮助您。

答案 1 :(得分:1)

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

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

我在我的应用程序的onCreate()中初始化它,并且该错误消失了。我相信你能以某种方式从Xamarin做到这一点。

答案 2 :(得分:0)

基本上这个问题出现在服务器端的SSL断链,服务器需要包含完整链并包含中间根链的时候,

了解更多信息,请参阅此链接。

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

答案 3 :(得分:0)

这是由于以下几个原因:

  1. 围绕较旧版本的TLS 1.2支持缺乏清晰性 Android设备。
  2. 设备制造商对官方的承诺不同 用于在其设备上发布TLS 1.2的Android规范
  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/

答案 4 :(得分:0)

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