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);