SSLHandshakeException на Android 4.4 и ниже

У меня возникла проблема, когда я хочу подключиться к API-интерфейсу Paypal Rest с помощью метода POST. Когда я не использую 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 Мне нужно использовать собственный сокет factory. Но как я могу реализовать его в HttpClient или modernHttpClient?

Ответы

Ответ 1

Не уверен, могу ли я полностью ответить на ваш вопрос, но я попробую:

Если вы проанализируете конечную точку API REST API Paypal, например, с помощью 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 кто-то опубликовал решение для включения TLS 1.2 для Android с уровнями API от 16 до 19 путем форматирования ModernHttpClient и добавления улучшенного SSL-сокета factory: https://forums.xamarin.com/discussion/63005/modernhttpclient-tls-1-2-android-api-19

Это должно исправить вашу проблему с этими версиями Android, но это не поможет вам с версиями до Android 4.1.

Ответ 2

Вы можете использовать ProviderInstaller из Google Play Services, он заменяет поставщика системного SSL более поздним, предоставленным Google:

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

Я инициализирую его в onCreate() моего приложения и эта ошибка исчезла. Я уверен, что вы можете сделать это от Xamarin как-то.

Ответ 3

В основном эта проблема возникает, когда SSL на стороне сервера имеет сломанную цепочку, серверу необходимо включить полную цепочку и включить промежуточную цепочку корней,

для получения дополнительной информации, пожалуйста, обратитесь к этой ссылке.

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