自定义SSL处理在Android 2.2 FroYo上停止运行

Eri*_*Kok 38 ssl android android-2.2-froyo

对于我的应用程序Transdroid,我通过HTTP连接到远程服务器,并可选择通过HTTPS安全地连接.对于与HttpClient的这些HTTPS连接,我使用自定义SSL套接字工厂实现来确保自签名证书正常工作.基本上,我接受一切,并忽略任何证书的每一次检查.

这已经有一段时间了,但它不再适用于Android 2.2 FroYo.尝试连接时,它将返回一个异常:

java.io.IOException: SSL handshake failure: I/O error during system call, Broken pipe
Run Code Online (Sandbox Code Playgroud)

以下是我初始化HttpClient的方法:

    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", new PlainSocketFactory(), 80));
    registry.register(new Scheme("https", (trustAll ? new FakeSocketFactory() : SSLSocketFactory.getSocketFactory()), 443));
    client = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParams, registry), httpParams);
Run Code Online (Sandbox Code Playgroud)

我使用了FakeSocketFactory和FakeTrustManager,其源代码可以在这里找到.

同样,我不明白为什么它突然停止工作,甚至错误'破管'的意思.我在Twitter上看到过Seesmic和Twidroid在FroYo上启用SSL时失败的消息,但我不确定它是否相关.

感谢您的任何指示/帮助!

Eri*_*Kok 42

这是答案,很多,非常感谢有意义的Seesmic开发人员愿意分享修复:

在自定义套接字工厂中,套接字创建(with createSocket)显然已针对SSLSocketFactory实现进行了专门更改.老了:

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
                    throws IOException, UnknownHostException {
            return getSSLContext().getSocketFactory().createSocket();
    }
Run Code Online (Sandbox Code Playgroud)

需要改为:

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
                    throws IOException, UnknownHostException {
            return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose);
    }
Run Code Online (Sandbox Code Playgroud)

然后它再次为我工作!

更新:由于这仍然是一个受欢迎的答案,让我更新我的工作代码链接.这个支持SSl的套接字工厂支持现代协议(TLS 1.1+),SNI,并且可选地允许接受所有证书(不安全,忽略所有SSL证书)或自签名证书(通过SHA-1哈希).