自定义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