Come installare un certificato CA affidabile sul dispositivo Android?


134

Ho creato il mio certificato CA e ora voglio installarlo sul mio dispositivo Android Froyo (HTC Desire Z), in modo che il dispositivo si fidi del mio certificato.

Android memorizza i certificati CA nel suo keystore Java in /system/etc/security/cacerts.bks. Ho copiato il file sul mio computer, ho aggiunto il mio certificato usando il portecle 1.5 e l'ho rispedito sul dispositivo.

Ora, Android non sembra ricaricare automaticamente il file. Ho letto in diversi post sul blog che devo riavviare il dispositivo. In questo modo il file viene sovrascritto nuovamente con quello originale.

Il mio prossimo tentativo è stato quello di installare il certificato dalla scheda SD copiandolo e utilizzando l'opzione corrispondente dal menu delle impostazioni. Il dispositivo mi dice che il certificato è stato installato, ma a quanto pare non si fida del certificato. Inoltre, quando provo a copiare il keystore sul mio computer, trovo ancora lo stock originale cacerts.bks.

Quindi, qual è il modo giusto per installare il mio certificato CA radice su un dispositivo Android 2.2 come certificato attendibile? C'è un modo per farlo programmaticamente?


Puoi assumere un telefono rootato qui. :)
Björn Marschollek il

Risposte:


116

Prima di Android KitKat devi eseguire il root del tuo dispositivo per installare nuovi certificati.

Da Android KitKat (4.0) fino a Nougat (7.0) è possibile e facile. Sono stato in grado di installare il certificato Charles Debbuging Proxy sul mio dispositivo non rootato e sniffare con successo il traffico SSL.

Estratto da http://wiki.cacert.org/FAQ/ImportRootCert

Prima della versione 4.0 di Android, con la versione Android Gingerbread & Froyo, esisteva un singolo file di sola lettura (/system/etc/security/cacerts.bks) contenente l'archivio sicuro con tutti i certificati CA ('sistema') considerati attendibili per impostazione predefinita su Android. Entrambe le app di sistema e tutte le applicazioni sviluppate con l'SDK di Android lo utilizzano. Utilizzare queste istruzioni sull'installazione dei certificati CAcert su Android Gingerbread, Froyo, ...

A partire da Android 4.0 (Android ICS / 'Ice Cream Sandwich', Android 4.3 'Jelly Bean' e Android 4.4 'KitKat'), i certificati di sistema fidati si trovano sulla partizione di sistema (sola lettura) nella cartella '/ system / etc / security / 'come singoli file. Tuttavia, ora gli utenti possono facilmente aggiungere i propri certificati "utente" che verranno archiviati in "/ data / misc / keychain / certs-Added".

I certificati installati dal sistema possono essere gestiti sul dispositivo Android nella sezione Impostazioni -> Sicurezza -> Certificati -> "Sistema", mentre i certificati affidabili dell'utente sono gestiti nella sezione "Utente" lì. Quando si utilizzano certificati attendibili dall'utente, Android costringerà l'utente del dispositivo Android a implementare ulteriori misure di sicurezza: l'uso di un codice PIN, un blocco modello o una password per sbloccare il dispositivo è obbligatorio quando vengono utilizzati certificati forniti dall'utente.

L'installazione dei certificati CAcert come certificati 'user trusted' è molto semplice. L'installazione di nuovi certificati come certificati di "sistema fidato" richiede più lavoro (e richiede l'accesso come root), ma ha il vantaggio di evitare i requisiti di blocco schermo Android.

Da Android N in poi diventa più piccolo, vedi questo estratto dal sito Web proxy Charles :

A partire da Android N, devi aggiungere la configurazione alla tua app per avere fiducia nei certificati SSL generati da Charles SSL Proxying. Ciò significa che puoi utilizzare il proxy SSL solo con le app che controlli.

Per configurare la tua app in modo affidabile, è necessario aggiungere un file di configurazione della sicurezza della rete alla tua app. Questo file può sovrascrivere le impostazioni predefinite del sistema, consentendo all'app di fidarsi dei certificati CA installati dall'utente (ad es. Il Charles Root Certificate). È possibile specificare che ciò si applica solo ai build di debug dell'applicazione, in modo che i build di produzione utilizzino il profilo di attendibilità predefinito.

Aggiungi un file res / xml / network_security_config.xml alla tua app:

<network-security-config>    
    <debug-overrides> 
        <trust-anchors> 
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" /> 
        </trust-anchors>    
    </debug-overrides>  
</network-security-config>

Quindi aggiungi un riferimento a questo file nel manifest della tua app, come segue:

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>

1
I miei file di certificato personalizzati ( /system/etc/security/cacerts/*.0) non vengono conservati dopo il riavvio / riavvio di AVD, quindi questa soluzione non ha avuto esito positivo.
fikr4n,

@BornToCode interessante - Uso raramente gli AVD, quindi non ero a conoscenza di questa limitazione
Dean Wild

Vedo l'impostazione debug-overrides, significa che questo ha network_security_configcome target solo la variante di debug? Se ho un'altra variante come la variante UAT, questo non funzionerà?
Isaac,

1
@Isaac significa che si applicherà a tutte le varianti in cui debuggable = true
Dean Wild

1
@DeanWild - grazie mille! Ho provato a farlo funzionare per sempre e ho continuato a ottenere "certificato SSL non valido" durante il debug della mia app. Questa soluzione ha funzionato come un fascino per la mia app Android in esecuzione su Android 9 su un Samsung Note 8.
Dave Black

43

Ho trascorso molto tempo a cercare una risposta a questo (ho bisogno di Android per vedere i certificati StartSSL). Conclusione: Android 2.1 e 2.2 consentono di importare certificati, ma solo per l'utilizzo con WiFi e VPN. Non esiste un'interfaccia utente per l'aggiornamento dell'elenco di certificati radice attendibili, ma si discute sull'aggiunta di tale funzione. Non è chiaro se esiste una soluzione alternativa affidabile per l'aggiornamento e la sostituzione manuali del file cacerts.bks.

Dettagli e collegamenti: http://www.mcbsys.com/techblog/2010/12/android-certificates/ . In quel post, vedi il link al bug 11231 di Android - potresti voler aggiungere il tuo voto e chiedere a quel bug.


3
Uno sviluppatore Android ha risposto alla mia domanda. aggiornamento di cacerts.bks: "in tutte le versioni anche se 2.3, è necessario un OTA per aggiornare cacerts.bks su un telefono non rootato". code.google.com/p/android/issues/detail?id=11231#c25 . OTA = over-the-air, giusto? Potrebbe essere questo il motivo per cui il tuo telefono continua a tornare a factory cacerts.bks? Tuttavia, se si dispone dell'accesso root, sembra che si dovrebbe essere in grado di scaricare il codice sorgente, aggiungere il proprio certificato, quindi creare cacerts.bks usando lo script certimport.sh. android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/… .
Mark Berry,

Grazie. Questa ovviamente non era la risposta che volevo sentire, ma sembra essere quella corretta. Speravo che ci fosse un modo per installare un certificato senza aggiornare l'intero sistema. Ovviamente posso costruire il nuovo cacerts.bks, con accesso root posso persino sostituire quello vecchio, ma ritorna alla versione originale ad ogni riavvio. Senza riavviare, Android sembra rifiutare di ricaricare il file dei certificati attendibili.
Björn Marschollek,

27
Che dire dell'installazione dei certificati CA su piattaforme 3.X e 4.X?
Alok Kulkarni


16

Se è necessario il certificato per le connessioni HTTPS, è possibile aggiungere il file .bks come risorsa non elaborata all'applicazione ed estendere DefaultHttpConnection in modo che i certificati vengano utilizzati per le connessioni HTTPS.

public class MyHttpClient extends DefaultHttpClient {

    private Resources _resources;

    public MyHttpClient(Resources resources) {
        _resources = resources;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
        if (_resources != null) {
            registry.register(new Scheme("https", newSslSocketFactory(), 443));
        } else {
            registry.register(new Scheme("https", SSLSocketFactory
                .getSocketFactory(), 443));
        }
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            KeyStore trusted = KeyStore.getInstance("BKS");
            InputStream in = _resources.openRawResource(R.raw.mystore);
            try {
                trusted.load(in, "pwd".toCharArray());
            } finally {
                in.close();
            }
            return new SSLSocketFactory(trusted);
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

Grazie per la tua risposta. In realtà, devo installare il certificato in modo tale che ogni applicazione sul dispositivo si fidi del certificato. Lo stesso problema dovrebbe esistere anche per alcune CA più piccole come CAcert, i cui certificati non sono considerati affidabili per impostazione predefinita. Come ottengono i loro certificati installati?
Björn Marschollek,

Hai provato: Impostazioni -> Sicurezza -> Installa da scheda SD
Alexander Egger

Anche questo potrebbe essere interessante: android.git.kernel.org/?p=platform/packages/apps/…
Alexander Egger

2
Ho lo stesso problema, devo caricare un certificato .PDX X509 usando l'applicazione Adroid 2.3.3 e quindi creare una connessione SSL. Qualcuno può aiutarmi con il codice commentato?
Studente Android

9

La guida qui collegata probabilmente risponderà alla domanda originale senza la necessità di programmare un connettore SSL personalizzato.

È stata trovata una guida dettagliata sull'importazione di certificati radice che guida l'utente attraverso l'installazione di certificati CA affidabili su diverse versioni di dispositivi Android (tra gli altri dispositivi).

Fondamentalmente dovrai:

  1. Scarica: il file cacerts.bks dal tuo telefono.

    adb pull /system/etc/security/cacerts.bks cacerts.bks

  2. Scarica il file .crt dall'autorità di certificazione che desideri autorizzare.

  3. Modifica il file cacerts.bks sul tuo computer usando il provider BouncyCastle

  4. Carica il file cacerts.bks sul tuo telefono e riavvia.

Ecco un passaggio più dettagliato per aggiornare i precedenti telefoni Android: Come aggiornare il keystore dell'autorità di certificazione del certificato di sicurezza HTTPS sul dispositivo pre-Android-4.0


5

Esiste una soluzione MOLTO più semplice di quella pubblicata qui o nei thread correlati. Se si utilizza una visualizzazione Web (come lo sono io), è possibile ottenere ciò eseguendo una funzione JAVASCRIPT al suo interno. Se non si utilizza una visualizzazione Web, è possibile crearne una nascosta per questo scopo. Ecco una funzione che funziona praticamente in qualsiasi browser (o webview) per avviare l'installazione (generalmente attraverso il repository di certificati os condiviso, incluso su un Droid). Usa un bel trucco con iFrames. Basta passare l'URL a un file .crt per questa funzione:

function installTrustedRootCert( rootCertUrl ){
    id = "rootCertInstaller";
    iframe = document.getElementById( id );
    if( iframe != null ) document.body.removeChild( iframe );
    iframe = document.createElement( "iframe" );
    iframe.id = id;
    iframe.style.display = "none";
    document.body.appendChild( iframe );
    iframe.src = rootCertUrl;
}

AGGIORNARE:

Il trucco iframe funziona su Droids con API 19 e versioni successive, ma le versioni precedenti della visualizzazione Web non funzioneranno in questo modo. L'idea generale funziona comunque: basta scaricare / aprire il file con una visualizzazione Web e lasciare che il sistema operativo prenda il sopravvento. Questa potrebbe essere una soluzione più semplice e universale (nell'attuale Java ora):

 public static void installTrustedRootCert( final String certAddress ){
     WebView certWebView = new WebView( instance_ );
     certWebView.loadUrl( certAddress );
 }

Si noti che istanza_ è un riferimento all'attività. Funziona perfettamente se conosci l'URL del certificato. Nel mio caso, tuttavia, lo risolvo dinamicamente con il software lato server. Ho dovuto aggiungere una buona quantità di codice aggiuntivo per intercettare un URL di reindirizzamento e chiamarlo in un modo che non causasse un arresto anomalo basato su una complicazione del threading, ma non aggiungerò tutta quella confusione qui ...


3

Quello che ho fatto per essere capace di usare i certificati di startsl è stato abbastanza facile. (sul mio telefono rootato)

Ho copiato /system/etc/security/cacerts.bks sulla mia sdcard

Scaricato http://www.startssl.com/certs/ca.crt e http://www.startssl.com/certs/sub.class1.server.ca.crt

Sono andato a portecle.sourceforge.net ed ho eseguito portecle direttamente dalla pagina web.

Ho aperto il mio file cacerts.bks dalla mia sdcard (non è stato inserito nulla quando è stata richiesta la password)

Scegli import in portacle e apri sub.class1.server.ca.crt, nel mio caso aveva già il ca.crt ma forse devi installarlo anche tu.

Ho salvato il keystore e copiato baxck in /system/etc/security/cacerts.bks (per prima cosa ho fatto un backup di quel file)

Ho riavviato il mio telefono e ora posso visitare il mio sito utilizzando un certificato di startsl senza errori.



qualche idea su come rimettere cacert.bks su un dispositivo NON rooted?
Bob,

1

Questi passaggi hanno funzionato per me:

  1. Installa l'app Dory Certificate per Android sul tuo dispositivo mobile: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=en_US
  2. Collega il dispositivo mobile al laptop con il cavo USB.
  3. Creare la cartella principale nella memoria interna del telefono, copiare il file del certificato in quella cartella e scollegare il cavo.
  4. Apri l'app Android Dory Certificate, fai clic sul pulsante rotondo [+] e seleziona l'opzione Importa certificato file corretta.
  5. Selezionare il formato, fornire un nome (ho digitato lo stesso nome del file), sfogliare il file del certificato e fare clic su [OK].
  6. Verranno elencate tre carte. Ho ignorato la scheda che aveva solo il pulsante [SIGN CSR] e ho continuato a fare clic sul pulsante [INSTALL] sulle altre due schede.
  7. Ho aggiornato l'app Web PWA che non avevo aperto sul mio dispositivo mobile Chrome (è ospitato su un server Web IIS locale) e voala! Nessun messaggio di avviso di Chrome. La serratura verde era lì. Funzionava.

In alternativa, ho trovato queste opzioni che non avevo bisogno di provare me stesso ma sembrava facile da seguire:

Infine, potrebbe non essere pertinente ma, se stai cercando di creare e configurare un certificato autofirmato (con mkcert) per la tua app PWA (sito Web) ospitato su un server Web IIS locale, ho seguito questa pagina:

https://medium.com/@aweber01/locally-trusted-development-certificates-with-mkcert-and-iis-e09410d92031

Grazie e spero che sia d'aiuto !! :)


0

Ecco una soluzione alternativa che aggiunge effettivamente il tuo certificato all'elenco integrato di certificati predefiniti: Fiducia in tutti i certificati usando HttpClient su HTTPS

Tuttavia, funzionerà solo per la tua applicazione. Non c'è modo di farlo a livello di programmazione per tutte le applicazioni sul dispositivo di un utente, poiché ciò costituirebbe un rischio per la sicurezza.


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.