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

Posted

技术标签:

【中文标题】自定义 SSL 处理在 Android 2.2 FroYo 上停止工作【英文标题】:Custom SSL handling stopped working on Android 2.2 FroYo 【发布时间】:2011-02-23 08:28:31 【问题描述】:

对于我的应用程序 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 时也会失败,但我不确定它是否相关。

感谢任何指示/帮助!

【问题讨论】:

【参考方案1】:

这是答案,非常感谢愿意分享修复的有用的 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 支持现代协议 (TLS 1.1+)、SNI 并可选择允许 accept all certificates(不安全,忽略所有 SSL 证书)或 self-signed certificates(通过 SHA-1 哈希)。

【讨论】:

我遇到了同样的问题。非常感谢您提供这种快速简便的解决方案。 这个修复本身并没有解决我的问题 - 我发现我还必须将建立套接字连接的线程的优先级提高到 THREAD_PRIORITY_URGENT_AUDIO (然后将优先级设置回连接建立后到 THREAD_PRIORITY_MORE_FAVORABLE)。在这种特定情况下,我怀疑动画使用了过多的 CPU :-( 我仍然有 SSL 握手失败:系统调用期间 I/O 错误,未知错误:0 如何在activity中调用上述函数?【参考方案2】:

有关此问题的更多信息 http://code.google.com/p/android/issues/detail?id=10472 这解决了我们在更新到 Android 2.2 时遇到的 HTC Desire 的 SSL 问题

【讨论】:

具体来说,请查看评论 #17:code.google.com/p/android/issues/detail?id=10807#c17。这对我准备好 Android 应用程序有很大帮助。

以上是关于自定义 SSL 处理在 Android 2.2 FroYo 上停止工作的主要内容,如果未能解决你的问题,请参考以下文章

Android使用SSL自签名证书

Android使用SSL自签名证书

Android使用SSL自签名证书

Android 自定义视频录制

自定义错误类型和处理

Android 上的自签名 SSL 接受