2011-12-28 16 views
4

私が取り組むアプリケーションでは、WebサーバーへのHTTPS接続を確立する必要があります。信頼できるエラーではなく証明書を取得していましたが、stackoverflowに相談した結果、このブログの投稿が見つかりました:http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/Android SSLエラー:証明書が信頼できない...時々

このサーバーのCAはAndroidのデフォルトストアには含まれていないようです。簡単に言えば、すべての証明書をダウンロードし、BKSプロバイダにキーストアを作成し、キーをインポートし、プロジェクトにキーストアをインポートし、DefaultHttpClientクラスをサブクラス化してキーストアを使用させました。

ブログの手順に従えば、エミュレータで完全に機能しました。しかし、私がデバイスでそれをテストすると、断続的に失敗します。私はパターンを孤立させたと思う。しばらくしてHTTPS接続をしようとすると、失敗するようです。その後、同じ接続を再度試みると、成功します。しばらく待ってからもう一度試してみると、初めて失敗し、繰り返し試行に成功します。おそらく、失敗したときに複数回試行するだけで問題を解決できますが、何が起こっているのか知りたいのですが。その動作はある種のキャッシュを示唆していますが、私はそれを見つけたり動作を変更する方法を知らない。誰が何が起こっているか、私が間違ってやっていることを知っている?どんな助けもありがとう。

答えて

1

純粋な推測ですが、間違いなく断続的に証明書が失敗していたWindows/IE環境では、同じような状況に陥ってしまいました。どちらの場合も、プロキシが干渉していると私が気づいていなかったプロキシを持っていました。ウェブデバッガ、私はそれが従事していたときにブラウザに証明書をプロキシた -

最初のものはフィドラーでした。

私は当社のインターネットフィルタリングソリューション(ウェブセンス)との問題を持っていた二時間も一種のプロキシとして動作する - それは正しく最終的にではなく、最初の試行で通過証明書の情報を可能にします。

これがあなたのケースであるかどうかはわかりませんが、それは私があなたが何を記述しているかのような振る舞いを見た唯一の時です。

0

オープン接続する前に、証明書チェーンの検証を行わないTrustManagerを作成し、それをHttpsURLConnectionにインストールすることができます。以下を参照してください:

`

private static void trustAllHosts() { 
    // Create a trust manager that does not validate certificate chains 
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return new java.security.cert.X509Certificate[] {}; 
     } 

     public void checkClientTrusted(X509Certificate[] chain, 
       String authType) throws CertificateException { 
     } 

     public void checkServerTrusted(X509Certificate[] chain, 
       String authType) throws CertificateException { 
     } 
    } }; 


    try { 
     SSLContext sc = SSLContext.getInstance("TLS"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     HttpsURLConnection 
       .setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

`

関連する問題