android上的HTTPS连接出现未知协议错误

时间:2012-08-02 16:19:19

标签: android rest ssl https openssl

我在Android应用程序上使用HTTPS调用REST服务。我已经有了这方面的工作代码,但现在我正在使用一个新安装的服务器来托管REST服务,我无法再建立连接。

以下是例外:

javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x15b7768: Failure in SSL library, usually a protocol error
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x402e5cc3:0x00000000)

应用程序使用Apache类与REST服务进行交互。即使使用接受任何类型证书的虚拟TrustManager,我也会收到此错误。

从Android Navigator调用REST服务时,连接已成功建立并正常工作。

Android手机正在运行HTC最新的4.0.3 Android。

REST服务是Apache上托管的mod_perl应用程序,配置了SSL支持。

https://github.com/android/platform_external_openssl/blob/ics-mr0/ssl/s23_clnt.c浏览OpenSSL源代码并没有给我任何提示,除了低级问题。

有关如何进一步调试的任何建议吗?

1 个答案:

答案 0 :(得分:16)

好的,我发现了问题所在。

根据建议使用OpenSSL s_client,它让我意识到我使用错误的端口号进行连接。新服务器正在使用标准SSL端口,而我之前使用的其他服务器则不然。

由于服务器没有根据SSL协议进行响应,因此OpenSSL无法有效地解码响应,因此Unknown Protocol Error无法解码。

对于想知道我如何使用OpenSSL s_client的人(在你的shell中):

$ openssl s_client -connect myhost.example.com:443 -tls1 -servername myhost.example.com

如果服务器上托管了多个站点,-servername选项会列出Server Name Indication (SNI)以确保服务器提供正确的证书。 SNI是TLS 1.0(及以上)选项,-tls1_1-tls1_2通常也有效。

然后显示有关刚刚打开的SSL连接的卡车负载信息。