Я пытаюсь получить доступ к своему 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?