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