1. ホーム
  2. android

[解決済み] 自己署名証明書による HTTPS 接続の受け入れ

2022-04-25 17:23:07

質問

HTTPS接続を行うために HttpClient しかし、問題は、この証明書が、以下のように認識された認証局 (CA) によって署名されていないことです。 ベリサイン , GlobalSIgn などが、Android Trusted Certificates のセットにリストアップされていますが、私はずっと javax.net.ssl.SSLException: Not trusted server certificate .

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

ブラウザと同じようなダイアログを表示して、ユーザーが続けるかどうか決められるようにしたいのですが。できれば、ブラウザと同じcertificatestoreを使用したいです。何かアイデアはありますか?

どのように解決するのですか?

まず、検証のレベルを設定する必要があります。 そのようなレベルは、それほど多くはありません。

  • allow_all_hostname_verifier
  • ブラウザ互換ホスト名検証子
  • strict_hostname_verifier

setHostnameVerifier()メソッドは、新しいライブラリであるapacheでは廃止されていますが、Android SDKのバージョンでは正常に動作します。 そこで ALLOW_ALL_HOSTNAME_VERIFIER というメソッドファクトリに設定します。 SSLSocketFactory.setHostnameVerifier() .

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

次に DefaultHttpClientSingleClientConnManager . また、以下のコードでは、デフォルトで私たちのフラグ( 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);