SSL: Android potrebbe non verificare il nome host, definendo le suite di crittografia

6

Sto sviluppando un'app per Android che invia alcune richieste HTTPS al nostro server Web (Linux, Nginx, SSL zertificato da "Let's Encrypt").

Le richieste hanno funzionato bene sui miei dispositivi di test (Android 4.2.2 e Android 6.0.1), ma su un altro dispositivo (5.1.1) la richiesta ha lanciato l'eccezione:

Cannot verify hostname [my_domain]

Guardando il certificato nel mio browser, sembra funzionare bene, usando la seguente connessione:

TLS 1.2 AES_128_GCM ECDHE_RSA

Dopo aver cercato sul Web aiuto, alla fine ho provato ad applicare un SSLSocketFactory personalizzato, che costringe il client a utilizzare Cipher Suite TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (che è stato utilizzato da i miei altri dispositivi di prova, a cui ha funzionato la richiesta).

Per farla breve: la richiesta poi ha funzionato su qualsiasi dispositivo, che indica che è colpa dei client che la connessione non ha avuto successo.

Quindi ora alle mie domande:

  • Perché la verifica SSL funziona su alcuni dispositivi Android, ma su alcuni no?

  • Perché l'eccezione dice che il hostname non può essere verificato , mentre il certificato è valido e il nome host indicato nel certificato è quello giusto?

  • È sbagliato associare le richieste a una suite di crittografia specifica? (Osservando quegli elenchi , la suite di cifratura fornita dovrebbe essere disponibile su tutte le necessarie Dispositivi Android (4.1.0 e versioni successive))

Sono abbastanza nuovo in SSL e non vedo l'ora di ricevere una risposta che possa aiutarmi a capire questo.

    
posta Florian Mötz 17.02.2016 - 22:39
fonte

2 risposte

2
  • CA che sta firmando il certificato non è uno degli archivi di certificati Android, quindi non convalida. Vedi in qualche modo come aggiornarlo
  • Il certificato
  • è ritenuto valido solo se è possibile stabilire il percorso di trust completo (your_cert - > intermediate_CA1 - > intermediate_CA2 .. - > root CA) (possono esserci 0 o più CA intermedie, ma CA principale deve essere presente in quel negozio di certificati versione Android). È necessario verificare eventuali problemi sul lato server (ad esempio, non inviare certificati intermedi, ad esempio) con ssllabs (obiettivo per "A "e nessun avviso arancione / rosso) e / o htbridge . Tieni presente che i dispositivi memorizzano nella cache i certificati intermedi, pertanto la tua app potrebbe funzionare anche senza modificare il codice. O potrebbe essere il codice specifico è buggato in quella versione di Android.
  • è cattivo. I consigli cambiano di volta in volta, e non tutte le persone aggiornano le loro app tutto il tempo. Dovresti lasciarlo alle automatiche. Se si desidera la migliore sicurezza di crittografia SSL, dovrebbe essere consigliata / richiesta automaticamente sul lato server , non sul client. Aiuterebbe anche con diversi livelli di supporto esistente a seconda delle versioni di Android. In breve: dovresti solo modificare l'ordine di cifratura preferito sul tuo server e sull'app Android utilizzare i valori predefiniti.
risposta data 18.02.2016 - 01:02
fonte
2

Qualche background su TLS (aka SSL) - Quando provi a stabilire una connessione sicura dal tuo client al server, il server invierà al client il suo certificato per provare la sua identità al client, insieme a un elenco di cifrarie che sostiene. Il client verifica l'identità assicurandosi che il dominio a cui si connette sia il dominio indicato nel certificato e che il certificato sia firmato da un valido autorità di certificazione . Fatto ciò, il client e il server stabiliscono alcuni segreti condivisi da cui derivare le chiavi e concordano anche su una ciphersuite.

Potresti notare che le ciphersuites (ad esempio TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) sono negoziate dopo l'identità dei server è stabilita. Ciò significa che se si verificava un problema durante la verifica del nome host, si verificava quando il server inviava al client il suo certificato, non quando venivano negoziate le cifrarie. In altre parole questo errore non dovrebbe essere collegato alla ciphersuite su cui il server e il client sono d'accordo, dato che succederebbe prima che una ciphersuite sia mai stata concordata.

La mia impressione è che questo potrebbe essere un fuorviante messaggio di eccezione che ti viene dato dalla libreria SSL utilizzata su Android. Non ho familiarità con le cipherute fornite con le librerie SSL su Android 5 "out of the box" per così dire, ma forse quando il server invia al client la sua lista di cifrari supportati, il client non vede alcuna cifra che supporta e questo ricade su alcune fuorvianti logiche di eccezione. Ti suggerirei di guardare a quali cifrarie il tuo server è configurato per supportare e anche a consultare la documentazione per Android 5 in merito alle cipheresi supportate. Una cosa che sembra essere vera dato quello che hai affermato è che il tuo certificato non è il problema qui.

    
risposta data 18.02.2016 - 11:46
fonte

Leggi altre domande sui tag