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が有効になっていると失敗するというメッセージを見ましたが、それが関連しているかどうかはわかりません。
方向性/ヘルプをありがとう!
解決策を共有してくれた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ハッシュによる)。
この問題に関する詳細情報 http://code.google.com/p/Android/issues/detail?id=10472 これにより、Android 2.2