自己署名証明書によるHTTPS接続の受け入れ 質問する

自己署名証明書によるHTTPS接続の受け入れ 質問する

libを使用してHTTPS接続を試みていますHttpClientが、証明書が次のような認定された証明機関(CA)によって署名されていないため、問題が発生します。ベリサイングローバルサインAndroid の信頼できる証明書のセットにリストされている、などですが、 というエラーが繰り返し表示されますjavax.net.ssl.SSLException: Not trusted server certificate

すべての証明書を単純に受け入れるソリューションを見たことがありますが、ユーザーに確認したい場合はどうすればよいでしょうか?

ブラウザと同様のダイアログを表示して、ユーザーが続行するかどうかを決定できるようにしたいです。できれば、ブラウザと同じ証明書ストアを使用したいと思います。何かアイデアはありますか?

ベストアンサー1

最初に行う必要があるのは、検証のレベルを設定することです。このようなレベルはそれほど多くありません。

  • ALLOW_ALL_HOSTNAME_VERIFIER
  • ブラウザ互換ホスト名検証
  • STRICT_HOSTNAME_VERIFIER

メソッド setHostnameVerifier() は新しいライブラリ Apache では廃止されていますが、Android SDK のバージョンでは標準です。そのため、ALLOW_ALL_HOSTNAME_VERIFIERメソッド factory で取得して設定しますSSLSocketFactory.setHostnameVerifier()

次に、プロトコルのファクトリーを https に設定する必要があります。これを行うには、SchemeRegistry.register()メソッドを呼び出すだけです。

DefaultHttpClient次に、を作成する必要がありますSingleClientConnManager。また、以下のコードでは、デフォルトでALLOW_ALL_HOSTNAME_VERIFIERメソッドによってフラグ( )も使用されることがわかります。HttpsURLConnection.setDefaultHostnameVerifier()

以下のコードは私にとっては機能します:

HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

DefaultHttpClient client = new DefaultHttpClient();

SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());

// Set verifier     
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

// Example send http request
final String url = "https://encrypted.google.com/";
HttpPost httpPost = new HttpPost(url);
HttpResponse response = httpClient.execute(httpPost);

おすすめ記事