web-dev-qa-db-ja.com

OkHttp SSLHandshakeException SSLハンドシェイクが中止されましたSSLライブラリの失敗、プロトコルエラー

04-23 17:17:38.434 21599-21956/ D/NativeCrypto: ssl=0x0 NativeCrypto_SSL_interrupt
04-23 17:17:38.435 21599-21956/ D/OkHttp: <-- HTTP FAILED: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x635d8808: Failure in SSL library, usually a protocol error
    error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:744 0x5e6c46fd:0x00000000)

Androidの下位バージョンのデバイス(4.1-4.4)でSSLエラーが発生します。以前は次のバージョンで正常に動作していました:

implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.9.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'

implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-jackson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0'

しかし、これらのライブラリをアップグレードすると、状況が変わります。すべてのサービス呼び出しでSSLハンドシェイクの例外が発生します。

implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.10.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-jackson:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0'

また、これらのライブラリを以前のバージョンにダウングレードしても、機能しません。ただし、前のコミットへのgitチェックアウトは正常に機能します。無知。

9
Ankur

OkHttp 4.xにアップグレードすると、この問題が発生しました。すべての既知のTLSバージョンとすべての既知の暗号を Ankerが推奨 として追跡する必要はなく、OkHttpの allEnabledTlsVersions および allEnabledCipherSuites メソッドを使用します。

val builder = OkHttpClient.Builder()
…
// The default OkHttp configuration does not support older versions of TLS,
// or all cipher suites.  Make our support as reasonably broad as possible.
builder.connectionSpecs(listOf(ConnectionSpec.CLEARTEXT,
    ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
        .allEnabledTlsVersions()
        .allEnabledCipherSuites()
        .build()))
…
val okHttpClient = builder.build()

OkHttpを定期的にアップグレードする限り、これらのリストは最新の状態を保ちます。 ConnectionSpec API doc から:

Builder.allEnabledTlsVersionsおよびBuilder.allEnabledCipherSuitesを使用して、すべての機能の選択を基盤となるSSLソケットに委任します。

各仕様の構成は、OkHttpのリリースごとに異なります。これは面倒です。OkHttpライブラリをアップグレードすると、特定のWebサーバーへの接続が切断される可能性があります。ただし、TLSエコシステムは動的であり、安全性を維持するには最新の状態を維持する必要があるため、これは必要な煩わしさです。これらの変更を追跡するには、OkHttpのTLS構成履歴を参照してください。

1
Stephen Talley