首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSL握手在Xamarin中失败

SSL握手在Xamarin中失败
EN

Stack Overflow用户
提问于 2019-06-17 21:54:13
回答 2查看 7.7K关注 0票数 8

我正在尝试访问我的RESTful API来从MySQL数据库中检索数据。在我的C# WPF项目上,所有的东西都设置好了,并且运行得很好。但是,在Xamarin窗体(为Android构建)中使用完全相同的代码时,我无法成功地与服务器进行SSL握手。

服务器详细信息

  • 让我们加密SSL证书(绝对有效)
  • Apache BasicAuth (.htaccess)
  • 只使用HTTPS (重写HTTP ),所以端口443
  • REST:(通过mevdschee)访问MariaDB 10.3

我使用Flurl.Http (使用HttpClient)来建立连接,但是在jsonReader.Wait()上得到一个异常:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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表单中工作(在Android上测试)。
  • 不适用于模拟器或专用设备。
  • 通过浏览器访问REST工作并按预期交付结果(在我的PC、Chrome仿真器和我的专用安卓上进行测试)
  • 更改项目属性下的HttpClient实现或SSL/TLS实现-> Android选项-> Advanced无助

为什么我的SSL握手失败了?Xamarin与WPF有什么不同?

EN

Stack Overflow用户

回答已采纳

发布于 2019-07-01 14:19:17

它原来是一个Apache配置错误。我检查了我的域名并注意到一个错误。这是通过在我的Apache指令中添加证书的链文件来修正的:

代码语言:javascript
复制
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验证:

代码语言:javascript
复制
// This disables the SSL certificate validity check.
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

该代码是不安全的,应该只用于测试。

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56639354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档