自定义SSL处理在Android 2.2 FroYo上停止工作

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

这一直在罚款一段时间了,但它不再适用于Android 2.2 FroYo。 当试图连接时,它将返回一个exception:

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,其中的源代码可以在这里find。

再一次,我不明白为什么突然停止工作,甚至是什么错误的“破pipe”意味着什么。 我在Twitter上看到了Seesmic和Twidroid在FroYo上启用SSL失败的消息,但是我不确定它是否有关系。

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

这是答案,许多非常感谢一个乐于分享修复的有用的Seesmic开发者:

在自定义的套接字工厂中,套接字的创build(使用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问题