我正在尝试访问我的RESTful API来从MySQL数据库中检索数据。在我的C# WPF项目上,所有的东西都设置好了,并且运行得很好。但是,在Xamarin窗体(为Android构建)中使用完全相同的代码时,我无法成功地与服务器进行SSL握手。
服务器详细信息
我使用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 我尝试过的/我所知道的
为什么我的SSL握手失败了?Xamarin与WPF有什么不同?
发布于 2019-07-01 14:19:17
它原来是一个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; };该代码是不安全的,应该只用于测试。
发布于 2019-06-18 06:55:27
由于使用了两种不同的项目类型,您的Flurl.Http可能会失败(.net标准与类库-我编写的http客户端的问题完全相同)。
为.net标准尝试不同的http客户端。
无论如何,您可以编写自己的http客户端和调试--这是我的建议。
如果你还坚持-回信,我会帮忙的。
https://stackoverflow.com/questions/56639354
复制相似问题