Android 4.4及更低版本的SSLHandshakeException

当我想用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握手exceptionandroid我需要使用自定义套接字工厂。 但是如何在HttpClient或modernHttpClient中实现它呢?

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

如果您分析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 Levels 20+中被禁用他们启用了它。

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

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

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

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

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

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

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

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