Android 4.4 及更低版本上的 SSLHandshakeException

Posted

技术标签:

【中文标题】Android 4.4 及更低版本上的 SSLHandshakeException【英文标题】:SSLHandshakeException on Android 4.4 and lower 【发布时间】:2016-09-10 09:35:57 【问题描述】:

我想通过 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 中实现呢?

【问题讨论】:

您目前使用的是哪个版本的Xamarin.Android Xamarin.Android 版本:6.1.0.56(Xamarin 商业版) 好的,我们正在使用 Alpha 6.1.99.xxx 并且有一个类似(但不同 ;-) 的问题,并已诉诸使用“本机”Java API,即HttpURLConnection 来做我们的由于HttpClient 发布Stream 的问题和获得Java IO 流结束问题而发布的帖子。跳过 .Net 框架为我们解决了这个问题。 所以我需要使用 HttpURLConnection 而不是 .Net 框架中的 HttpClient 进行更改?以后试试 这不是一个“微不足道”的变化,因为 HttpURLConnection 来自 Java 框架,因此不是替代品,但对我们来说,跳过 .Net/Mono 框架并仅使用 Java 框架让我们得到了解决“问题”(仍然不确定问题是什么...... .Net到Java桥,只是Xamarin中的一个错误,他们在内部使用Java流,......)内容长度有问题正在发布与内容的实际长度... 【参考方案1】:

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

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

现在 Android 从 API 级别 16 开始支持此功能,您可以在此处看到 https://developer.android.com/reference/javax/net/ssl/SSLSocket.html,但默认情况下禁用它,只有在 API 级别 20+ 时才启用它。

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

这应该可以解决您使用这些 Android 版本的问题,但它不会帮助您使用 Android 4.1 之前的版本。

【讨论】:

【参考方案2】:

这是由于以下几个原因:

    对于旧版本的 TLS 1.2 支持缺乏明确性 Android 设备。 设备制造商对官方的承诺不同 在其设备上发布 TLS 1.2 的 Android 规范 运营商和设备制造商有不同的承诺 向客户提供软件和安全更新。

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

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

    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/

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

更多信息请参考此链接。

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于Android 4.4 及更低版本上的 SSLHandshakeException的主要内容,如果未能解决你的问题,请参考以下文章

如何检查我是否在Android 4.4及以上版本中以编程方式打开gps? [重复]

在 Android 2.3 .X (Gingerbread) 及更低版本上修改 LayerDrawable 层

如何在颤动中将音乐文件提取到 Android 10 及更低版本的应用程序中

我如何检查运行我的应用程序的 Android 设备是不是在 4.2.2 及更低版本上运行 [重复]

Android 11 - 本机 C++ 库的 System.loadLibrary 需要 60 多秒,在 Android 10 及更低版本上运行速度非常快

从 iOS 11 上的左侧菜单导航后 Xcode 9 导航栏问题不在 iOS 10.3 及更低版本上