2017-10-26 15 views
0

この質問はHow can I pin a certificate with Square OKHTTP?と重複している可能性がありますが、わからないのでもう一度お尋ねします。 HTTPクライアントにSSL証明書を添付する必要があります。私は改造版を使用しています2.2.0とokHttpバージョン3.6.0okhttpでの証明書のピン割り当て

私は.crtの形式で証明書を持っています。現在、私はas shown hereのピン留めをしています。しかし、私はそれが正しいかどうかわからない。 以下は、私のコード

 static void pinCertificate(Context context, OkHttpClient.Builder builder) { 
      try { 
       CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
       InputStream cert = context.getResources().openRawResource(R.raw.certificate); 
       Certificate ca; 
       ca = cf.generateCertificate(cert); 

       // creating a KeyStore containing our trusted CAs 
       String keyStoreType = KeyStore.getDefaultType(); 
       KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
       keyStore.load(null, null); 
       keyStore.setCertificateEntry("ca", ca); 


       String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
       TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
       tmf.init(keyStore); 


       SSLContext sslContext = SSLContext.getInstance("TLS"); 
       sslContext.init(null, tmf.getTrustManagers(), null); 
       builder.sslSocketFactory(sslContext.getSocketFactory()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

それはokHttpと.crt証明書を固定する適切な方法はありますか?ハンドシェイクを適切に行っているかどうかをテストするにはどうすればよいですか? 誰かが証明書を正しく固定するためのサンプルコードを表示できますか? このようないくつかのサンプルとドキュメントを見ました。https://medium.com/@develodroid/android-ssl-pinning-using-okhttp-ca1239065616

しかし、それは私が実装したものとはまったく異なります。彼らはcrtファイルを使用していません。

誰かが証明書のピン割り当てとそれをokhttpでどのように行うことができるかについて、より良い説明を共有できれば、非常に役に立ちます。 ありがとうございます!

+1

あなたのコードは、自己署名証明書をサポートするためのものです。認証局からの通常の証明書を証明書に固定したい場合は、リンク先の中規模の投稿は問題ありません。 – CommonsWare

+0

'crt'ファイルは自己署名証明書を意味しますか? – Jrd

+0

必ずしもそうではありません。自分のWebサイトを管理している人に、自己署名証明書であるかどうかを尋ねます。 – CommonsWare

答えて

1

これは証明書のピン割り当てです。それは正しい方法です。 フィドラーまたはチャールズを使用して、https証明書を電話でテストすることができます。リクエストが成功しなかった場合、ピニングは正常に動作しています。 ssl固定を無効にしてテストします。その場合、リクエストが成功すると、あなたはまた、私は次のことを実施している証明書

内の公開鍵のSHAを固定します公開鍵ピニングを使用することができシオマネキやチャールズ

に要求+データを見ることができますway

  InputStream cert = context.getResources().openRawResource(R.raw.certificate);    
      CertificateFactory cf=CertificateFactory.getInstance("X.509", "BC"); 
      InputStream caInput = new BufferedInputStream(cert); 
      X509Certificate ca = (X509Certificate) cf.generateCertificate(caInput); 
      caInput.close(); 
      KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      keyStore.load(null); 
      keyStore.setCertificateEntry(ca.getSubjectX500Principal().getName(), ca); 
      KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509"); 
      kmf.init(keyStore, null); 
      KeyManager[] keyManagers = kmf.getKeyManagers(); 
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
      tmf.init(keyStore); 
      SSLContext context1 = SSLContext.getInstance("TLS"); 
      context1.init(keyManagers, tmf.getTrustManagers(), null); 
      builder.sslSocketFactory(context1.getSocketFactory()); 
+0

_ **これは証明書のピン割り当てです。それは正しい方法です**あなたがペーストしたコードを意味しますか? – Jrd

+0

"これは証明書のピン割り当てです" - OkHttpの開発者は同意しません。 [**これは証明書のピニングです](https://github.com/square/okhttp/wiki/HTTPS#certificate-pinning)。あなたが持っているものは[プラットフォームの信頼できる証明書を自分で置き換える](https://github.com/square/okhttp/wiki/HTTPS#customizing-trusted-certificates)です。 – CommonsWare

+0

@CommonsWareそこに何か問題はありますか?私は何かを変更する必要がありますか? – Jrd

0

あなたのやり方は正しい方法です。あなたが実装しているのと同じ方法でこれをやった。それと一緒に行くのは良いです。ハッピーコーディング:)

関連する問題