gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:06:31 24 4
gpt4 key购买 nike

对于我的应用程序 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,可以找到它们的源代码 here .

再说一次,我不明白为什么它突然停止工作,甚至不明白错误“Broken pipe”是什么意思。我在 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);
}

然后它又对我有用了!

更新:由于这仍然是一个流行的答案,让我更新我的工作代码链接。 This SSl-enabled socket factory支持现代协议(protocol) (TLS 1.1+)、SNI 并可选择允许 accept all certificates (不安全,忽略所有 SSL 证书)或 self-signed certificates (通过 SHA-1 哈希)。

关于android - 自定义 SSL 处理在 Android 2.2 FroYo 上停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2899079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com