サーバーの自己署名証明書を固定しようとしています。Okhttp3 - すべての証明書を受け入れ、証明書を使用してください。
new CertificatePinner.Builder()
.add("bogus.com", "sha1/BOGUS")
.build()
注:
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
};
// Install the all-trusting trust manager
SSLContext sslContext;
try {
sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
FirebaseCrash.report(e);
return null;
}
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
第二には、証明書のピンナです:私は、その後、すべての作品をcertificatePinnerを追加しない場合 私OkHttpClientは、2つのパラメータを取り、最初のものは、SSLソケットファクトリです良い。問題は、要求が実行されますと、CertificatePinner.check()が呼び出されるということです。
if (pins.isEmpty()) return;
もちろん、私は(空でない)certificatePinnerを設定しない場合、方法はそこに停止しませんし、続行します。 "少なくとも私のホスト名に固定された証明書の1つが信頼できる証明書であることを確認します"。
問題は、TrustManagerのgetAcceptedIssuersに空の配列を渡したことです。つまり、「getAcceptedIssues」で明示的に信頼されていないため、自己署名付き証明書が例外をトリガーします。 "getAcceptedIssuers"で明示的に信頼されていない証明書を固定するのは不可能なようです。
これを回避する方法はありますか?それは設計によるのですか?
これは私が私のOkHttpClientを構築する方法である:
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])
.certificatePinner(certPinner)
.readTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.build();
あなたが提供したコードは、私の元の質問に正確には答えていませんが、間違いなく助けてくれました。あなたの助けを借りて、有効なTrustManagerを作成しました。 – geecko
ええ、私はあなたがしようと思っていたことに答えようとしていました。自分で署名した証明書を追加して、安全な接続を確立しました。すべての証明書を受け入れてから固定しようとするのは、典型的な使用例のようではありません。 –