web-dev-qa-db-ja.com

カスタム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を利用していますが、そのソースは here です。

繰り返しますが、なぜそれが突然作業を停止したのか、あるいは「パイプが壊れた」というエラーの意味すらわかりません。 TwitterでSeesmicとTwidroidがFroYoでSSLが有効になっていると失敗するというメッセージを見ましたが、それが関連しているかどうかはわかりません。

方向性/ヘルプをありがとう!

38
Eric Kok

解決策を共有してくれた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);
    }

そして、それは私のために再び働きました!

UPDATE:これは今でも一般的な答えなので、作業中のコードへのリンクを更新させてください。 このSSl対応のソケットファクトリ 最新のプロトコル(TLS 1.1 +)、SNIをサポートし、オプションで すべての証明書を受け入れる (安全ではない、すべてのSSL証明書を無視する)または- 自己署名証明書 (SHA-1ハッシュによる)。

42
Eric Kok

この問題に関する詳細情報 http://code.google.com/p/Android/issues/detail?id=10472 これにより、Android 2.2

1
Jinu