l'installazione del certificato autofirmato rivendica il successo, ma Android si comporta come se non ci fosse CERT


17

Sto cercando di installare il certificato autofirmato per il mio server Web in Android 4.3. Ho il file .crt nella radice della scheda SD (che in realtà è emulato in quanto non ho una scheda SD nello slot).

Per installare il certificato, vado su Impostazioni -> Generale -> Sicurezza -> Archivio credenziali -> Installa da archivio dispositivo.

Ottengo una finestra di dialogo che mostra il nome del certificato (il nome del file meno l'estensione .crt) che posso modificare (ma non fare), un "usato per" pull down con "VPN e app" selezionate e il testo in fondo della finestra di dialogo che informa "Il pacchetto contiene: un certificato utente". Tutto sembra a posto, quindi faccio clic su "Ok". La finestra di dialogo scompare e viene visualizzato un messaggio di brindisi con "[nome] installato".

Tuttavia, se vado immediatamente a "Credenziali attendibili e seleziono" Utente ", non c'è nulla lì! Anche il nuovo certificato non è in" Sistema ", ma non mi aspetterei lì. Se vado a un browser dopo questo e provo ad accedere al mio sito Web, ricevo ancora l'avviso che il certificato del sito non è attendibile. Ho anche provato a riavviare, ma non fa differenza.

Che cosa sto facendo di sbagliato? La completa mancanza di messaggi di errore non è utile. È possibile che il mio certificato sia nel formato sbagliato? Ho provato a utilizzare il file .crt nella directory ssl del server e ho provato a convertirlo in formato DER.

Aggiornamento: ho letto da qualche parte che Android richiede che i certificati siano in formato p12, quindi ho convertito il certificato Apache2 in p12 usando il seguente comando:

openssl pkcs12 -export -inkey server.key -in server.crt -out ~/server.p12

Ho quindi ripetuto i passaggi precedenti, ho ricevuto lo stesso messaggio di successo e quindi ho continuato a non vedere il certificato nelle credenziali dell'utente e ricevo ancora l'errore di certificato non attendibile dal browser del cellulare.

Risposte:


19

Ho avuto lo stesso problema con Android per installare davvero il certificato, fino a quando ho trovato questo sito che descrive un metodo che ha funzionato per me. Si riduce ai seguenti passaggi:

  1. Crea una chiave privata e un certificato x509 pubblico con estensioni v3_req e abilitato come CA:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/my_site.key -out /etc/ssl/certs/my_site.crt -reqexts v3_req -extensions v3_ca

  2. Converti il ​​certificato in formato DER, che è compreso da Android:

    sudo openssl x509 -in /etc/ssl/certs/my_site.crt -outform der -out my_site.der.crt

  3. Utilizza qualsiasi metodo per accedere my_site.der.crtal tuo dispositivo Android: ho trovato facile avere il file ospitato dal mio server Web e scaricarlo tramite il browser Android, che poi ti consente automaticamente di installarlo.

Anche se mi sarebbe piaciuto che il passaggio 1 fosse suddiviso in due (generazione 1a di chiave privata e generazione 1b di certificato pubblico), non ho investito troppo tempo a indagare su come farlo. Per favore fatemi sapere in un commento se avete trovato un modo che funziona, grazie.

(Piuttosto che aggiungere un commento, penso che questo appartenga davvero alla risposta come riferimento futuro, quindi lo sto modificando .-- Michele)

Invece di creare un certificato abilitato come CA, ho creato una CA autofirmata e quindi ho firmato nuovamente la mia chiave / csr esistente con la nuova CA. Quindi ho aggiunto la CA autofirmata ad Android e voilà! Ha funzionato!

Generazione della CA autofirmata:

openssl genrsa -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -days 3650 -out rootCA.pem

Ri-firma un CSR esistente che ho avuto dalla creazione della chiave dal

openssl x509 -req -in existing.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out existing.crt -days 3649

Ora usando una forma modificata del tuo secondo comando ho convertito il certificato CA in forma DER:

openssl x509 -in /etc/apache2/ssl/rootCA.pem -outform der -out ~/rootCA.der.crt

La cosa grandiosa di ciò è che tutti i certificati non attendibili aggiuntivi che sono ora riprogrammati con la nuova CA autofirmata saranno ora attendibili su qualsiasi dispositivo rispetto alla nuova CA installata senza la necessità di installare altro. Ciò non risolve esattamente il problema della fiducia nei siti sui quali non hai alcun controllo, ma potrebbe essere più semplice se hai qualche influenza sul (diciamo) il tuo dipartimento IT per un server interno o qualcosa del genere.


1
Ho già il certificato che devo installare, quindi ho provato il passaggio 2 e non viene ancora visualizzato nelle credenziali attendibili dell'utente dopo che afferma di riuscire a installare, e Chrome visualizza ancora l'errore "sito non attendibile" dopo il riavvio.
Michael,

1
Potrebbe esserci qualcosa sull'estensione v3_req e abilitato come CA che il certificato deve avere per Android per usarlo? In tal caso, esiste un comando che posso usare per prendere un certificato esistente e aggiungere quelle informazioni ad esso, poiché non ho il controllo su tutti i certificati che voglio installare.
Michael,

3
Per rispondere alla prima metà della mia domanda precedente, ho letto la pagina che avevi collegato e sembra che il problema sia che Android rifiuta di installare certificati autofirmati (ma non CA autofirmati). Questo sembra non essere documentato e il fatto che Android pretenda di installarlo rende ancora peggio. Ma la domanda rimane, se ho un certificato autofirmato di cui non ho il controllo, c'è un modo per "CA": identificarlo in modo che possa installarlo?
Michael,

1
@Spero che non ti dispiaccia, ho intenzione di modificare la tua risposta per includere la mia soluzione, piuttosto che includerla nei commenti, in quanto appartiene davvero alla risposta.
Michael,

1
Non capisco come viene generata la richiesta di firmaisting.csr. Penso che questo sia l'ultimo punto mancante per un tutorial passo-passo completo.
Cguenther,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.