2017-08-11 1 views
2

Hallo liebe Entwickler,Android - Zertifikat Pinning mit Retrofit 2.3 und OkHTTP

Ich habe folgendes Problem:

Ich bin mit Zertifikat Pinning erfolgreich seit einigen Monaten mit OkHTTP 3.6 und 1.9 nachrüsten. 0.

Vor kurzem habe ich die verwendete Retrofit-Version auf 2.3.0 aktualisiert und mit OkHttp 3.8 begonnen. Seit den Updates funktioniert das Certificate Pinning nicht mehr auf Geräten zwischen AN 4.1 und AN 6.0.

Ich versuchte mit verschiedenen OkHTTP-Versionen, hatte aber kein Glück. Außerdem habe ich versucht, die Verwendung einer bestimmten OkHTTP-Version über Gradle zu erzwingen, aber daran hat sich nichts geändert.

Hier ist der Code, den wir für Pinning verwenden:

public CertificatePinner provideCertificatePinner(@PinForDomain(DEUTSCHE_POST) final PinnedDomain deutschePost, @PinForDomain(NOVOMIND) final PinnedDomain novomindPin, @PinForDomain(EMMI) final PinnedDomain emmiPin) { 
    Log.d(LOG_TAG, "Creating CertificatePinner"); 
    final CertificatePinner.Builder builder = new CertificatePinner.Builder(); 
    builder.add("www.url.com", "sha256Key"); 
    return builder.build(); 
} 

public OkHttpClient provideOkHttpClient(CertificatePinner pinner) { 

    Log.d(LOG_TAG, "Creating OkHttpClient"); 
    final OkHttpClient.Builder clientBuilder = new OkHttpClient().newBuilder(); 
    clientBuilder.certificatePinner(provideCertificatePinner); 
    clientBuilder.connectTimeout(BuildConfig.CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS); 
    clientBuilder.writeTimeout(BuildConfig.WRITE_TIMEOUT, TimeUnit.MILLISECONDS); 
    clientBuilder.readTimeout(BuildConfig.CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS); 
    return clientBuilder.build(); 
} 

Also habe ich versucht, die folgenden Dinge:

Erzwingen der Verwendung von TLS v1.2

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

und eine eigene Implementierung SSLSocketFactory Erzwingen der Verwendung von TLS v1.2 in Version unter AN 4.1 nach:: https://github.com/square/okhttp/issues/2372

EDIT:

Zur Verdeutlichung. Das Pining funktioniert nicht, so dass ich die Verbindung zwischen meiner App und dem Backend Server abfangen kann => 'Man in the middle'.

Im Moment bin ich völlig verloren, wie man dieses Problem beheben kann. Jede Hilfe wird geschätzt.

Prost Pascal

+0

Bitte erläutern im Detail, was „das Zertifikat Pinning nicht mehr funktioniert“ Mittel gegeben gestört. – CommonsWare

+0

@CommonsWare Tut mir leid, ich habe das vergessen, habe es jetzt hinzugefügt. Vielen Dank! –

+0

Erstellen Sie ein reproduzierbares Testprojekt und reichen Sie ein Problem mit den OkHttp-Leuten ein und erklären Sie, wie Sie den MITM-Angriff (Charles, etc.) machen, denke ich. – CommonsWare

Antwort

0

fand ich heraus, dass das Problem nicht durch OKHTTP/Retrofit verursacht wurde, sondern durch eine Fehlkonfiguration auf Client-Seite. Da ich in diesem Projekt ziemlich neu war, wusste ich nicht alles.

Sorry, Sie und Dank für jede Hilfe haben

Verwandte Themen