でcom.squareup.retrofit2:retrofit:2.0.1
とcom.squareup.okhttp3:okhttp:3.2.0
を使用すると、 私は、ルートCAによって署名された自己署名証明書を使用して公開鍵のピン設定を実装しようとしています。そのルートCAはシステムCAの信頼ストアにあります。いくつかの小さな変更でokhttp wikiによって提供された例使用okhttpでピンが正しく検証されない
:ピンが正しくありませんが、何が起こることはresponse.isSuccessfulがtrueを返すということです
OkHttpClient client = new OkHttpClient.Builder().certificatePinner(
new CertificatePinner.Builder()
.add(pinningUrl, "sha256/invalidPIN")
.build()).build();
Request request = new Request.Builder()
.url(pinningUrl)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
for (Certificate certificate : response.handshake().peerCertificates()) {
System.out.println(CertificatePinner.pin(certificate));
}
は、例外は、スローされません。正しく実行されるのは、システムCAの信頼ストア内のルートCAを使用した証明書の検証だけです。
私はうまくいきましたが、forループの前にこの行を追加しています。しかし、これはリクエストが既に送信されているため正しいアプローチではなく、TLSネゴシエーションが完了する前に固定が機能するはずです。また、この行は私が見つけたサンプルコードでは言及されていません。
client.certificatePinner().check(pinningUrl, response.handshake().peerCertificates());
は
javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!
をスローokhttpか、私は何か間違ったことをやっていることにより、提供されているサンプルコードのバグはありますか?
私はこの拡張機能を発見しました。これはこの問題を解決します。 https://github.com/square/okhttp/issues/1653 – Tom