2012-08-02 75 views
10

我在android应用程序上使用HTTPS调用REST服务。我已经有了这个工作代码,但现在我正在使用托管REST服务的新安装的服务器,我无法再建立连接。在android上使用HTTPS连接发生未知协议错误

这里是个例外:

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源代码不会给我任何提示,除了低级别的问题。

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

+0

可能的重复:http://stackoverflow.com/questions/6735408/apache-commons-net-ssl-handshake-error-with-android – petey 2012-08-02 16:42:33

+0

你检查过新服务器是否正确安装了SSL证书? – petey 2012-08-02 16:42:54

+1

还可以使用openssl s_client连接并查看服务器正在发送的内容。 – 2012-08-03 06:03:33

回答

17

好吧,我发现问题是什么。

继建议使用OpenSSL s_client后,我意识到我使用错误的端口号进行连接。新服务器正在使用标准SSL端口,而之前我以前使用的其他服务器并非如此。

由于服务器不根据SSL协议响应,所述响应不能有意义地通过OpenSSL的解码,因此Unknown Protocol Error

对于想知道我是怎么用的OpenSSL的s_client.First(在你的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连接的卡车载荷信息。

+0

另请参阅[哪些密码套件启用SSL套接字?](http://stackoverflow.com/a/23365536/608639)。 Java在其'SSLSocketFactory'中有一些令人讨厌的隐藏行为;和'SSLSocketFactoryEx'确保协议和密码套件是“可接受的”(通过现代定义的“可接受的”)。 – jww 2015-06-13 20:05:09

相关问题