2017-03-01 4 views
0

유효한 인증서로 인식되지 않습니다,하지만 난 항상라는 예외를 얻을 :OkHttp3 : SSL 인증서 내가 <code>SSL</code> 인증서를 테스트 할 수있는 내부 서버에 <code>HTTPS</code> 전화를 걸 <code>RxJava2</code> 및 <code>OkHttp3</code>와 <code>Retrofit2</code>을 사용하고

HTTP FAILED: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

Google developer documentation에 따르면,이

내가 canno (알 수없는 CA, 자체 서명 인증서 또는 서버 구성이 중간 CA가 없습니다) 발생할 수있는 이유 3 가지 이유가 있습니다

enter image description here

: 그것은 내부 테스트 서버이지만, 내 컴퓨터 또는 크롬 잘 작동 내 휴대 전화 브라우저에 URL을 열기로 t는, URL을 게시, 이것은 내가 인증서에서 볼 수있는 것입니다

따라서 브라우저가 인증서를 인식하고, 내 앱과 OkHttp 만 보이지 않기 때문에 옵션 1이 될 수 없다고 생각합니다. 또한 자체 서명 인증서가 아니기 때문에 옵션 2도 원인이되어서는 안됩니다.

그리고 이것은 내 OkHttp 클라이언트가 Dagger에서 제공하는 방법입니다

@Provides 
@PerApplication 
OkHttpClient provideOkHttpClient(@ApplicationContext Context context) { 
    int cacheSize = 10 * 1024 * 1024; // 10 MiB 

    File cacheDirectory = new File(context.getCacheDir().getAbsolutePath(), "HttpCache"); 

    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.Builder httpClientBuilder = new OkHttpClient.Builder() 
      .connectionSpecs(Collections.singletonList(spec)) 
      .readTimeout(60, TimeUnit.SECONDS) 
      .connectTimeout(10, TimeUnit.SECONDS) 
      .cache(new Cache(cacheDirectory, cacheSize)); 

    if (BuildConfig.DEBUG) { 
     HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); 
     loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     httpClientBuilder.addInterceptor(loggingInterceptor); 
    } 

    return httpClientBuilder.build(); 
} 

은 내가 TLS 1.2을 사용하고 있음을 정의 할 수 CollectionSpec을 추가했지만이 차이가 없습니다, 난 여전히 신뢰 앵커 오류가 발생 .

SSL 인증서를 사용하기 위해 설정해야 할 다른 것이 있습니까? 인증서가 왜 받아 들여지지 않는가?

+0

"브라우저가 인증서를 인식하기 때문에 옵션 1이 될 수 없다고 생각합니다."- Chrome이 수락하는 것은 안드로이드 SDK 앱이 루트 인증 기관의 관점에서 받아 들일 수있는 것과 일치하지 않는다고 가정합니다. – CommonsWare

+0

당신 말이 맞습니다. – Eve

+0

@Eve 나는 똑같은 얼굴을 보았고 http://stackoverflow.com/a/42392679/2870088에 대답했다. 옵션 3 중간 인증 기관 누락입니다. 예, 브라우저는 중간 인증서를 캐시하고 다른 사이트간에 사용합니다. 따라서 중간 인증서가 누락 된 경우 무작위 사용자는 신뢰 오류를 수신하지만 그렇지 않은 사용자는 신뢰 오류를 수신하게됩니다. http://superuser.com/questions/351516/do-intermediate-certificates-get-cached-in-firefox –

답변

0

문제가 자체적으로 해결되었으므로 서버의 URL이 올바르지 않습니다.