OkHttp(5)의 HTTPS

3820 단어
OKHttp의 Calls
OKHttp의 연결
OkHttp(3) 사용 방법
OkHttp(4) 차단기
OkHttp(5)의 HTTPS
Retrofit 사용 설명 (1)
Retrofit 사용 설명(2)
Retrofit 사용 설명(3)
Retrofit 사용 설명(4)
Retrofit 사용 설명(5)
Retrofit 사용 설명(6)
이 영화는 번역이 매우 좋지 않다. 왜냐하면 나는 https 프로토콜을 이해하지 못하기 때문이다. 나는 서버를 하는 것도 아니고 앞부분도 아니다.
OkHttp는 두 경쟁의 초점을 맞추려고 시도합니다.
  • 가능한 한 많은 호스트에 연결합니다.여기에는 최신 버전의 boringssl을 실행하는 고급 호스트와 이전 버전의 OpenSSL을 실행하는 비교적 유행이 지난 호스트가 포함됩니다
  • 연결의 안전성.인증서와 강력한 암호로 교환된 데이터의 프라이버시를 사용하여 원격 웹 서버를 검증하는 것을 포함합니다..

  • HTTPS 서버에 연결할 때 OkHttp는 어떤 TLS 버전과 암호 세트를 제공하는지 알아야 합니다.연결성을 최대한 높이고 싶은 클라이언트는 유행이 지난 TLS 버전과 약한 디자인 암호 세트를 제공할 것이라고 말했다.보안을 극대화해야 하는 엄격한 클라이언트는 최신 TLS 버전과 가장 강력한 암호 세트에만 국한됩니다.
  • MODERN_TLS는 현대 HTTPS 서버에 연결되는 보안 구성입니다..
  • COMPATIBLE_TLS는 보안에 연결되지만 현재 HTTPS 서버에 연결되지 않는 보안 구성입니다..
  • CLEARTEXT는 http://URL을 위한 안전하지 않은 구성입니다..

  • 기본적으로 OkHttp에서 MODERN_ 을 시도합니다.TLS 연결, 현재 구성에 실패하면 COMPATIBLE_로 돌아가기TLS 연결.
    각 사양의 TLS 버전 및 암호 키트는 각 버전에 따라 달라질 수 있습니다.예를 들어 OkHttp 2.2에서 우리는 POODLE 공격에 대응하기 위해 SSL 3.0에 대한 지원을 포기했다.OkHttp 2.3에서 우리는 RC4에 대한 지원을 포기했다.데스크톱 웹 브라우저와 최신 OkHttp를 유지하는 것이 보안을 유지하는 가장 좋은 방법입니다.
    사용자 정의 TLS 버전 및 암호 세트를 사용하여 자신의 연결 사양을 구축할 수 있습니다.예를 들어 이 설정은 세 가지 중시되는 암호 세트에 한정된다.Android 5.0+와 유사한 현재 네트워크 서버가 필요하다는 단점이 있습니다.
    ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)  
        .tlsVersions(TlsVersion.TLS_1_2)
        .cipherSuites(
              CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
              CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
              CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
        .build();
    
    OkHttpClient client = new OkHttpClient.Builder() 
        .connectionSpecs(Collections.singletonList(spec))
        .build();
    

    인증서 잠금


    기본적으로 OkHttp는 호스트 플랫폼의 인증서 발급 기관만 신뢰합니다.이 정책은 연결성을 최대한 높였지만 인증서 발급 기관의 공격, 예를 들어 2011 DigiNotar 공격을 받았다.공격은 또한 HTTPS 서버의 인증서가 인증서 발급 기관에서 서명한 것으로 가정합니다.
    CertificatePinner를 사용하여 신뢰할 수 있는 인증서와 인증서를 제한합니다.인증서 잠금은 보안을 향상시키지만 서버 팀이 TLS 인증서를 업데이트하는 능력을 제한합니다.서버의 TLS 관리자의 축복이 없으면 인증서 잠금을 사용하지 마십시오!
    public CertificatePinning() {
        client = new OkHttpClient.Builder()
            .certificatePinner(new CertificatePinner.Builder()
                .add("publicobject.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=")
                .build())
            .build();
      }
    
      public void run() throws Exception {
        Request request = new Request.Builder()
            .url("https://publicobject.com/robots.txt")
            .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));
        }
      }
    

    사용자 정의 신뢰 인증서


    전체 코드 예시는 호스트 플랫폼의 인증서 발급 기구를 자신의 집합으로 바꾸는 방법을 보여 줍니다.위에서 말한 바와 같이 서버의 TLS 관리자의 축복이 없으면 사용자 정의 인증서를 사용하지 마십시오!
    private final OkHttpClient client;
    
      public CustomTrust() {
        SSLContext sslContext = sslContextForTrustedCertificates(trustedCertificatesInputStream());
        client = new OkHttpClient.Builder()
            .sslSocketFactory(sslContext.getSocketFactory())
            .build();
      }
    
      public void run() throws Exception {
        Request request = new Request.Builder()
            .url("https://publicobject.com/helloworld.txt")
            .build();
    
        Response response = client.newCall(request).execute();
        System.out.println(response.body().string());
      }
    
      private InputStream trustedCertificatesInputStream() {
        ... // Full source omitted. See sample.
      }
    
      public SSLContext sslContextForTrustedCertificates(InputStream in) {
        ... // Full source omitted. See sample.
      }
    

    좋은 웹페이지 즐겨찾기