自定义SSL处理停止在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

这里是我如何初始化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);

我使用了一个FakeSocketFactory和FakeTrustManager,其中的源代码可以在这里找到。

再一次,我不明白为什么它突然停止工作,甚至不知道错误“断管”的含义。 我在Twitter上看到过消息Seesmic和Twidroid在FroYo上启用了SSL失败,但我不确定它是否有关。

感谢任何方向/帮助!


这里有答案,很多非常感谢一个乐于分享修复的有帮助的Seesmic开发人员:

在自定义套接字工厂中,创建套接字(使用createSocket )显然已经针对SSLSocketFactory实现进行了专门的更改。 所以旧的:

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

需要更改为:

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

然后它再次为我工作!

更新:因为这仍然是一个受欢迎的答案,让我更新我的链接到工作代码。 支持现代协议(TLS 1.1+),SNI和启用SSI的套接字工厂允许接受所有证书(不安全,忽略所有SSL证书)或自签名证书(通过SHA-1哈希)。


有关此问题的更多信息http://code.google.com/p/android/issues/detail?id=10472这修复了我们更新到Android 2.2后,针对HTC Desire的SSL问题

链接地址: http://www.djcxy.com/p/31155.html

上一篇: Custom SSL handling stopped working on Android 2.2 FroYo

下一篇: Android HttpClient and HTTPS