我在
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导航器调用REST服务时,连接成功建立并且正常工作.
Android手机正在运行HTC最新的4.0.3 Android.
REST服务是Apache上托管的mod_perl应用程序,配置了SSL支持.
浏览OpenSSL源代码在https://github.com/android/platform_external_openssl/blob/ics-mr0/ssl/s23_clnt.c除了低级别的问题之外,还没有提供任何提示.
有什么建议如何进一步调试?
解决方法
好的,我发现问题是什么.
根据建议使用OpenSSL s_client,这使我意识到我使用错误的端口号连接.新服务器正在使用标准的SSL端口,而不是我之前使用的其他服务器的情况.
由于服务器根据SSL协议无响应,因此无法通过OpenSSL有意义地解释响应,从而导致未知协议错误.
对于想知道我如何使用OpenSSL s_client(在你的shell中)的人:
$openssl s_client -connect myhost.example.com:443 -tls1 -servername myhost.example.com
如果在服务器上托管了多个站点,则“服务器名称”选项将启用Server Name Indication (SNI)以确保服务器提供正确的证书. SNI是TLS 1.0(及以上)选项,-tls1_1和-tls1_2通常也可以工作.
然后显示关于刚刚打开的SSL连接的卡车装载信息.