SSL рукопожатие не удается в Xamarin - PullRequest
3 голосов
/ 18 июня 2019

Я пытаюсь получить доступ к своему RESTful API для получения данных из базы данных MySQL. Все настроено и отлично работает на моем проекте C # WPF. Но при использовании точно такого же кода в формах Xamarin (созданных для Android) я не могу получить успешное рукопожатие SSL с моим сервером.

Данные сервера

  • SSL-сертификат Let's Encrypt (обязательно действительный)
  • Apache BasicAuth (.htaccess)
  • Только HTTPS (перезаписать HTTP включен), поэтому порт 443
  • REST API: php-crud-api (от mevdschee) для доступа к MariaDB 10,3

Я использую Flurl.Http (использует HttpClient) для установления соединения, но получаю исключение для jsonReader.Wait ():

var jsonReader = "https://example.com/my_api/api.php/records/my_table?order=id,desc&size=10"
            .WithHeader("Accept", "application/json")
            .WithBasicAuth("username", "password")
            .GetJsonAsync<JsonRootObject>();
            // Wait for completion.
            jsonReader.Wait();


Это мое AggregateException:

System.AggregateException: One or more errors occurred. (Call failed. An error occurred while sending the request
GET https://example.com/my_api/api.php/records/my_table?order=id,desc&size=10) ---> Flurl.Http.FlurlHttpException: Call failed. An error occurred while sending the request
GET https://example.com/my_api/api.php/records/my_table?order=id,desc&size=10 ---> System.Net.Http.HttpRequestException: An error occurred while sending the request
---> System.Net.WebException: Error: TrustFailure (Authentication failed, see inner exception.) ---> System.Security.Authentication.AuthenticationException:
Authentication failed, see inner exception. ---> Mono.Btls.MonoBtlsException: Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED
at /Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/external/boringssl/ssl/handshake_client.c:1132
at Mono.Btls.MonoBtlsContext.ProcessHandshake () [0x00038] in <74989b9daab94528ac2c4b7da235b9c5>:0 
at Mono.Net.Security.MobileAuthenticatedStream.ProcessHandshake (Mono.Net.Security.AsyncOperationStatus status, System.Boolean renegotiate) [0x000a1] in <74989b9daab94528ac2c4b7da235b9c5>:0 
at (wrapper remoting-invoke-with-check) Mono.Net.Security.MobileAuthenticatedStream.ProcessHandshake(Mono.Net.Security.AsyncOperationStatus,bool)
at Mono.Net.Security.AsyncHandshakeRequest.Run (Mono.Net.Security.AsyncOperationStatus status) [0x00006] in <74989b9daab94528ac2c4b7da235b9c5>:0
at Mono.Net.Security.AsyncProtocolRequest.ProcessOperation (System.Threading.CancellationToken cancellationToken) [0x000ff] in <74989b9daab94528ac2c4b7da235b9c5>:0
at Mono.Net.Security.AsyncProtocolRequest.StartOperation (System.Threading.CancellationToken cancellationToken) [0x0008b] in <74989b9daab94528ac2c4b7da235b9c5>:0 


Что я пробовал / что я знаю

  • Код отлично работает в WPF
  • Точно такой же код (копирование-вставка) работает , а не в Xamarin Forms (протестировано на Android Pie)
  • не работает ни в эмуляторе, ни на выделенном устройстве
  • доступ к REST API через браузер работает и обеспечивает ожидаемые результаты (тестировано на моем ПК, эмуляторе в Chrome и моем выделенном Android)
  • Изменение реализации HttpClient или реализации SSL / TLS в разделе Свойства проекта -> Параметры Android -> Дополнительно не помогает

Почему происходит сбой рукопожатия SSL? Что делает Xamarin иначе, чем WPF?

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Оказалось Ошибка конфигурации Apache проверил свой домен и заметил ошибку.Это было исправлено добавлением цепочки файлов сертификата в мои директивы Apache:

SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

Последняя строка была недостающей.Странно, что браузеры и WPF доверяют сертификату даже без цепочки-файла.В любом случае, теперь он также работает на Android.

Тем временем я использовал этот фрагмент кода, чтобы отключить проверку SSL в моем приложении:

// This disables the SSL certificate validity check.
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Этот код unsafe и должен использоваться только для тестирования.

0 голосов
/ 18 июня 2019

ваш Flurl.Http может потерпеть неудачу из-за использования 2 разных типов проектов (стандарт .net против библиотеки классов - у меня была точно такая же проблема с http-клиентом, который я написал)

попробуйте другой http-клиент для стандарта .net.

в любом случае, вы можете написать свой собственный http-клиент и отлаживать - это моя рекомендация.
если вы все еще застряли - напишите, я помогу.

...