Android 2.2版本的SSL握手失败

我正在开发一个需要从服务器validation证书的应用程序。 它适用于Android 2.3及更高版本,但对于Android 2.2,它给了我一个例外:

W/System.err( 2116): java.io.IOException: SSL handshake failure: Failure in SSL library, usually a protocol error W/System.err( 2116): error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure (external/openssl/ssl/s3_pkt.c:1053 0x3a5208:0x00000003) W/System.err( 2116): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeconnect(Native Method) W/System.err( 2116): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:305) W/System.err( 2116): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.(OpenSSLSocketImpl.java:502) W/System.err( 2116): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:443) 

当设备尝试从SSLSocket检索InputStream时,此错误来自BufferedInputStream。 代码如下:

 BufferedInputStream getSocketReader() throws IOException { BufferedInputStream bis = new BufferedInputStream(sslSocket.getInputStream(), 32768); return bis; } 

这是我当前的createEasySSLContext()方法代码:

 private static SSLContext createEasySSLContext() throws IOException { try { SSLContext context = SSLContext.getInstance("TLS"); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(sampleKeystore, "password".toCharArray()); CustomX509TrustManager trustManager = new CustomX509TrustManager(null); context.init(keyManagerFactory.getKeyManagers(), new TrustManager[]{trustManager}, null); return context; } catch (Exception e) { throw new IOException(e.getMessage()); } } 

怎么会发生这种情况? 我可以修复它而不会失去Android 2.2支持吗? 谢谢。

发布服务器证书的CA更可能不受Android 2.1的信任。 获取新证书,或创建包含CA证书的信任存储区并设置代码以使用它。

更多信息和一些示例代码。

在我看来,服务器的证书不是2.1的识别forms。 您可以通过更改使用服务器端的证书或密码算法来解决此问题。