web-dev-qa-db-ja.com

SSLSocketFactoryはAndroidで非推奨になったので、クライアント証明書認証を処理する最良の方法は何でしょうか?

私はAndroidクライアント証明書認証を必要とするアプリ(PKCS 12ファイルを使用)で作業しています。すべての非推奨に続いてApache.http.*、私たちはネットワーク層でリファクタリングのかなり大きな仕事を始めました、そして、代わりとしてOkHttpで行くことに決めました、そして、今のところ私はそれがとても好きです。

ただし、SSLSocketFactoryを使用せずに、OkHttpなどを使用してクライアント証明書認証を処理する他の方法は見つかりませんでした。それでは、この特定の場合の最善の行動は何でしょうか? OkHttpでこの種の認証を処理する別の方法はありますか?

17
TheYann

どうやら、2つのSSLSocketFactoryクラスがあります。 HttpClientには独自のものがあり、これはHttpClientの他の部分とともに非推奨です。ただし、他のすべての人は より一般的なjavax.net.sslエディションのSSLSocketFactory 、これは非推奨ではありません(ありがとう$DEITY)。

15
CommonsWare

httpsを使用している場合、有効な証明書を使用する必要があります。開発段階では、証明書を信頼する必要がありますか? sslSocketFactory(SSLSocketFactory sslSocketFactory)は廃止され、sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager)に置き換えられました。以下のコードを使用して、ssl証明書を信頼する信頼できるOkHttpClientを取得するのに役立つgradleファイルを更新する必要があります。

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
    throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
}
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[] { trustManager }, null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, trustManager);
32
user2167877

これを見て、私はいくつかの解決策を見つけ、私の側ではうまく機能しています。統合方法を確認してください。

OkHttpClient.Builder client = new OkHttpClient.Builder();

ここにクライアントインスタンスのすべてのプロパティを追加します

。 。 。

sslSocketFactoryの次のコード行を追加します。

 try {
        // Create a trust manager that does not validate certificate chains
        final TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(Java.security.cert.X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public void checkServerTrusted(Java.security.cert.X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public Java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new Java.security.cert.X509Certificate[]{};
                    }
                }
        };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new Java.security.SecureRandom());

        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        client.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
        client.hostnameVerifier((hostname, session) -> true);
    } catch (Exception e) {
        throw new RuntimeException(e);
  }
2
Krste Moskov