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

标签 android ssl xamarin websocket

我正在尝试打开从 Xamarin Android 应用程序到 IIS 服务器的安全 websocket 连接。除了Samsung Tab E 之外,它在我用过的所有设备上都运行良好且花花公子。甚至其他三星设备也能正常工作。

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

var _webSocket = WebSocketFactory.Create();
_webSocket.OnOpened += _webSocket_Opened;
_webSocket.OnError += _webSocket_Error;
_webSocket.Open("wss://server.name.here/path/also/");

在这种情况下调用错误处理程序:

[websockets] javax.net.ssl.SSLException
[websockets] javax.net.ssl.SSLException: Error occured in delegated task:javax.net.ssl.SSLException: Unexpected exception

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

确实在另一个第三方库尝试检查来自单独网站的许可证并记录错误时出现问题:

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x803b3b28: Failure in SSL library, usually a protocol error

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

这让我相信选项卡 E 中的 Android(v4.4.4,最新可用)的 SSL 实现有问题,因为这两个通过 javax.net.ssl 的连接尝试都失败了。但是意外异常并没有提供太多信息。

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

附加信息

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

Certificate chain
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 Domain Validation Secure Server CA
1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root

No client certificate CA names sent
Server Temp Key: ECDH, P-256, 256 bits

New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit

不幸的是,openssl 不再支持 ´-ssl2` 标志。网上工具说禁用SSL2,启用SSL3、TLS1、TLS1.1和TLS1.2。

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

最佳答案

在 Android 中搜索 SSL 问题后,我找到了适合我的案例的解决方案。 Florian Krauthan 写过这些东西并谈论过 using the SSLSocketFactory on Android 4.1+允许使用 TLS1.1 等

这让我看到了另一篇文章,他解释了如何 Google Play Services can be used to inject a newer OpenSSL library进入整个应用程序。此方法也适用于我的问题。

唯一需要做的就是在主 Activity 的 OnCreate() 方法的开头添加以下代码:

Android.Gms.Security.ProviderInstaller.InstallIfNeeded(this);

在此之后,该应用程序将使用 Google Play 服务的 OpenSSL 库,因此所有连接都可以正常工作,并且内置 Android OpenSSL 库中可能的已知错误会得到缓解,因为使用了较新的版本。

当然,对于尚未使用 Google Play 服务的任何人来说,这可能不是一个解决方案,因为它会极大地增加应用程序的大小。

关于android - 打开安全的 websocket 连接时出现意外异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40022395/

相关文章:

java - 安卓开发 : Can't generate multiple layouts dynamically from an XML template

android - Firebase 搜索事件术语未显示在分析中

asp.net - 在没有管理员帐户的情况下保护 ELMAH

ssl - x.509 证书序列号格式在括号内和不在括号内有什么区别。

android - 如何在 addChildEventListener 中计算 child 数?

android - 获取 UI 层次结构 XML 文件时出错 : com. android.ddmlib.SyncException : Remote object doesn't exist!“,为具有动态定位器的应用程序显示

web-services - Tomcat 7 和 SSL 配置问题

c# - Xamarin Forms OAuth 2.0 和 Azure Active Directory - 错误 AdalServiceException : AADSTS7000218

c# - Xamarin Forms 更改选项卡栏大小

iphone - monotouch 处理 UIWebView