2016-04-26 9 views
0

com.squareup.retrofit2:retrofit:2.0.1com.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か、私は何か間違ったことをやっていることにより、提供されているサンプルコードのバグはありますか?

答えて

2

これは間違った設定です。 pinningUrlを、固定URLのホスト名に置き換えます。たとえば、http://example.com/の代わりにexample.comが必要です。ホスト名の検証をより厳密にするためにPRを送る場合は、大歓迎です。

+0

私はこの拡張機能を発見しました。これはこの問題を解決します。 https://github.com/square/okhttp/issues/1653 – Tom

関連する問題