39

私のアプリであるTransdroidの場合、HTTP経由でリモートサーバーに接続し、オプションでHTTPS経由で安全に接続しています。HttpClientとのこれらのHTTPS接続では、カスタムSSLソケットファクトリ実装を使用して、自己署名証明書が機能していることを確認しています。基本的に、私はすべてを受け入れ、証明書のすべてのチェックを無視します。

これはしばらくの間正常に機能していましたが、Android2.2FroYoでは機能しなくなりました。接続しようとすると、例外が返されます。

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を有効にすると失敗するというメッセージを見たことがありますが、それが関連しているかどうかはわかりません。

指示/ヘルプをありがとう!

4

2 に答える 2

43

答えは次のとおりです。修正を共有してくれる親切なSeesmic開発者に感謝します。

カスタムソケットファクトリでは、ソケットの作成(with )は、実装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をサポートし、オプションですべての証明書(安全でない、すべてのSSL証明書を無視する)または自己署名証明書(SHA-1ハッシュによる)を受け入れることができるこのSSl対応のソケットファクトリ。

于 2010-05-25T15:57:00.533 に答える
1

この問題の詳細 http://code.google.com/p/android/issues/detail?id=10472 これにより、Android2.2にアップデートしたときにHTCDesireで発生したSSLの問題が修正されました。

于 2010-09-02T18:05:53.990 に答える