打开安全websocket连接时出现意外异常



我正在尝试从Xamarin Android应用程序到IIS服务器打开一个安全的websocket连接。它在我用过的所有设备上都很好用,除了三星Tab E。即使其他三星设备也可以正常工作。

我正在使用Websockets。PCL库和常规代码:

var _webSocket = WebSocketFactory.Create();
_webSocket.OnOpened += _webSocket_Opened;
_webSocket.OnError += _webSocket_Error;
_webSocket.Open("wss://server.name.here/path/also/");
在这种情况下,错误处理程序被调用:

(尚)javax.net.ssl.SSLException
[websockets] javax.net.ssl. sslexcexception: Error occurred in delegated task:javax.net.ssl. sslexcexception: Unexpected exception

设备通过Chrome或其他应用程序的SSL连接没有问题,与此服务器或其他服务器没有问题。从这个应用程序通过SignalR连接到同一个IIS服务器也没有问题。

有一个问题,当另一个第三方库试图从一个单独的网站检查许可证,并记录一个错误:

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: SSL =0x803b3b28: Failure in SSL library,通常是一个协议错误

我不知道它试图联系哪个地址,所以无法检查那里发生了什么。但这也可以在其他设备上使用。

这让我相信Android在Tab E (v4.4.4,最新可用)有一些错误的SSL实现,因为这两个连接尝试通过javax.net.ssl失败。但是这个意外的异常并没有提供太多的信息。

如何解决这个问题?我不介意使用SignalR使用的websockets实现(因为它可以工作),但据我所知,它并没有真正暴露为一个通用的系统。

<<p> 附加信息/strong>

服务器确实很好地与TLS1通信,并发送了据我所知的整个证书路径,所以这不应该是问题,除非根不知道(如果是这种情况,我预计会得到握手失败)。使用openssl测试显示:


证书链0 s:/OU=Domain Control Validated/OU=PositiveSSL/CN=our.domain.com
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA域验证安全服务器CA
1 s:/C=GB/ST=大曼彻斯特/L=索尔福德/O=COMODO CA Limited/CN=COMODO RSA域验证安全服务器CA
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA证书颁发机构
2 s:/C=GB/ST=大曼彻斯特/L=索尔福德/O=COMODO CA Limited/CN=COMODO RSA证书颁发机构
i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root

没有发送客户端证书CA名称
服务器临时密钥:ECDH, p - 256,256位

新,TLSv1/SSLv3,密码为ECDHE-RSA-AES256-SHA
服务器公钥为2048位

不幸的是openssl不再支持' -ssl2 '标志了。在线工具显示SSL2已禁用,SSL3、TLS1、TLS1.1和TLS1.2已启用。

我可以尝试自定义SSLSocketFactory路由,但必须看看它如何通过Xamarin和Websockets.PCL。

在Android中搜索SSL问题后,我找到了一个解决方案。Florian Krauthan已经写过关于这些事情的文章,并谈到在Android 4.1+上使用SSLSocketFactory来允许使用TLS1.1等。

这让我看到了另一篇文章,他解释了如何使用Google Play Services将更新的OpenSSL库注入整个应用程序。此方法也适用于我的问题。

唯一需要做的是将以下代码添加到主活动的OnCreate()方法的开头:
Android.Gms.Security.ProviderInstaller.InstallIfNeeded(this);

在此之后,应用程序将使用Google Play Services的OpenSSL库,因此所有连接都可以正常工作,而内置的Android OpenSSL库中可能存在的已知错误由于使用了新版本而得到缓解。

当然,对于那些还没有使用Google Play服务的人来说,这可能不是一个解决方案,因为它极大地增加了应用程序的大小。

相关内容

  • 没有找到相关文章

最新更新