2017-10-26 4 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

반드시 그렇지는 않습니다. 자체 서명 된 인증서인지 아닌지 웹 사이트를 관리하는 사람에게 물어보십시오. – CommonsWare

답변

1

인증서 고정입니다. 그것은 올바른 방법입니다. 바이올렛 또는 찰스https인증서을 전화로 설치하여 테스트 할 수 있습니다. 요청이 성공하지 못하면 고정이 제대로 작동합니다. ssl 고정을 비활성화하여 테스트하십시오. 이 경우 요청이 성공적으로 될 것입니다 그리고 당신은 피들러 또는 찰스의 요청 + 데이터를 볼 수있을 것이다

또한 내가 구현 한 인증서 내에서 다음을

를 공개 키의 샤 핀 것 공개 키 고정 기능을 사용할 수 있습니다 방법

  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

당신이하고있는 방식이 적절한 방법입니다. 당신이 구현하는 것과 같은 방식으로 이것을했습니다. 그걸로가는 것이 좋다. 해피 코딩 :)

관련 문제