Xamarin App通过https

时间:2017-02-16 11:39:57

标签: c# android wcf xamarin xamarin.android

我正在开发一个Xmarain.Forms应用程序,最初在Android上工作以及它将连接到的服务。该服务是WCF服务,需要使用安全传输来发送消息,因此设置为使用https。

我可以使用SoapUI和使用相同客户端代理库构建的控制台程序正确连接和使用该服务,但是当我尝试使用Xamarin应用程序时,它失败了。在模拟器中运行时,异常是TimeoutException,但是当安装在实际设备上时,异常是WebException,消息为“Error:SecureChannelFailure(认证或解密失败”,内部异常堆栈为:

  
      
  • IOException,消息“身份验证或解密失败”
  •   
  • IOException,带有消息“发送TLS警报时出错(致命:内部错误)”
  •   
  • IOException,带有消息“验证或解密失败。
  •   
  • IOException,带有消息“无法从传输连接读取数据:连接由同行重置”
  •   

完整堆栈跟踪包含在下面作为附件。 https://github.com/staircase27/WcfXamarinHttpBugExample提供了完整的代码以及如何设置和使用它的说明。示例代码使用http和https进行连接以显示差异,并显示一个有效,另一个无效。我还在测试时检查了设备是否可以使用他们的网络浏览器访问服务,因此它不是防火墙或路由问题。

我还连接了连接以查看连接失败的确切位置,并且它在TLS v1.0级别失败。应用程序(在我测试过的两台设备上)都在发送客户端Hello,服务正在响应TCP ​​RST数据包而不是服务器Hello。我还使用成功的网络浏览器从测试设备执行了连接,主要区别在于支持的加密类型,特别是应用程序仅提供使用

  
      
  • TLS_RSA_WITH_AES_256_CBC_SHA
  •   
  • TLS_RSA_WITH_AES_128_CBC_SHA
  •   
  • TLS_RSA_WITH_3DES_EDE_CBC_SHA
  •   
  • TLS_RSA_WITH_RC4_128_SHA
  •   
  • TLS_RSA_WITH_RC4_128_MD5
  •   
  • TLS_RSA_WITH_DES_CBC_SHA
  •   

用作工作连接的地方

  
      
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  •   

有两个连接的已过滤的wireshark位于https://github.com/staircase27/WcfXamarinHttpBugExample/raw/master/Mobile%20WCF%20https%20Capture%20-%20Filtered.pcapng。第一个连接来自应用程序,并以tcp rst失败。第二个是从Android网络浏览器开始连接。

我启用了所有版本的TLS和所有cypher套件,但它没有更改应用中的wireshark跟踪或异常。

我还检查了@tomasr推荐的SChannel事件日志,发现了以下事件:

  
      
  • SSL客户端握手成功完成。协商的加密参数如下。协议:TLS 1.0。 CipherSuite:0xc014。交流强度:256
  •   

(在启用所有版本的TLS之前,事件是:

  
      
  • 从远程客户端应用程序收到TLS 1.0连接请求,但服务器不支持客户端应用程序支持的任何密码套件。 SSL连接请求失败。
  •   
  • 生成以下致命警报:40。内部错误状态为1205。
  •   

Nexus 7 - part 1  Nexus 7 - part 2 Android Emulator

1 个答案:

答案 0 :(得分:0)

可悲的是,由于评论中没有任何建议有效,我不得不解决这个问题,现在正在使用RESTful WCF API,并使用HttpClient手动实现了客户端。

相关问题