Android 2.2版本的SSL握手失败

时间:2012-02-17 13:01:58

标签: java android ssl-certificate

我正在开发一个需要从服务器验证证书的应用程序。它适用于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.<init>(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支持吗?谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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