web-dev-qa-db-fra.com

OkHttp SSLHandshakeException Handshake SSL abandonné Échec dans la bibliothèque SSL, une erreur de protocole

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)

Les appareils Android de version inférieure (4.1 - 4.4) donnent une erreur SSL. Auparavant, fonctionnait bien avec les versions suivantes:

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'

Mais après la mise à niveau de ces bibliothèques, les choses changent. Chaque appel de service donne une exception de prise de contact 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'

De plus, si je rétrograde ces bibliothèques vers la version précédente, cela ne fonctionne toujours pas. Mais git checkout pour le commit précédent fonctionne très bien. Aucune idée.

9
Ankur

J'ai rencontré ce problème lors de la mise à niveau vers OkHttp 4.x. Plutôt que d'avoir à garder une trace de toutes les versions TLS connues et de tous les chiffrements connus comme Anker recommande , utilisez les méthodes allEnabledTlsVersions et allEnabledCipherSuites d'OkHttp:

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()

Ces listes resteront à jour tant que vous mettrez à jour OkHttp régulièrement. Depuis le doc API ConnectionSpec :

Utilisez Builder.allEnabledTlsVersions et Builder.allEnabledCipherSuites pour reporter toute la sélection de fonctionnalités au socket SSL sous-jacent.

La configuration de chaque spécification change avec chaque version d'OkHttp. C'est ennuyeux: la mise à niveau de votre bibliothèque OkHttp peut interrompre la connectivité à certains serveurs Web! Mais c'est une gêne nécessaire car l'écosystème TLS est dynamique et il est nécessaire de rester à jour pour rester en sécurité. Consultez l'historique de configuration TLS d'OkHttp pour suivre ces modifications.

1
Stephen Talley