2015-05-19 7 views
15

Avevo installato un certificato a livello di codice.Come eliminare il certificato installato dall'utente a livello di programmazione?

sono in grado di disinstallare manualmente andando Settings -> Security -> Trusted Credentials -> User -> Choose the certificate and click the remove button

voglio rimuovere il certificato di programmazione.

Ecco il codice che ho provato ma non ha funzionato.

javax.security.cert.X509Certificate x509 = javax.security.cert.X509Certificate.getInstance(caRootCertBytes); 

KeyStore ks = KeyStore.getInstance("AndroidCAStore") 
if (ks != null) 
{ 
    ks.load(null, null); 
    Enumeration<String> aliases = ks.aliases(); 
    while (aliases.hasMoreElements()) 
    { 
     String alias = (String) aliases.nextElement(); 
     java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias); 
     String name = x509.getIssuerDN().getName();        
     if (cert.getIssuerDN().getName().contains(name)) 
     { 
      ks. deleteEntry(alias) 
     } 
    } 
} 

Ref per questo che ho scelto deleteEntry

Ecco il log degli errori che ho ottenuto

05-19 18:27:40.789: W/System.err(14588): java.lang.UnsupportedOperationException 
05-19 18:27:40.792: W/System.err(14588): at com.android.org.conscrypt.TrustedCertificateKeyStoreSpi.engineDeleteEntry(TrustedCertificateKeyStoreSpi.java:82) 
05-19 18:27:40.792: W/System.err(14588): at java.security.KeyStore.deleteEntry(KeyStore.java:410) 
05-19 18:27:40.792: W/System.err(14588): at com.proj.test.MyActivity$4.onClick(MyActivity.java:336) 
05-19 18:27:40.792: W/System.err(14588): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162) 
05-19 18:27:40.792: W/System.err(14588): at android.os.Handler.dispatchMessage(Handler.java:102) 
05-19 18:27:40.792: W/System.err(14588): at android.os.Looper.loop(Looper.java:135) 
05-19 18:27:40.793: W/System.err(14588): at android.app.ActivityThread.main(ActivityThread.java:5254) 
05-19 18:27:40.793: W/System.err(14588): at java.lang.reflect.Method.invoke(Native Method) 
05-19 18:27:40.794: W/System.err(14588): at java.lang.reflect.Method.invoke(Method.java:372) 
05-19 18:27:40.794: W/System.err(14588): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
05-19 18:27:40.794: W/System.err(14588): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Questa domanda è in qualche modo legato alla mia altra question

Ogni aiuto è apprezzato!

+0

Related on AOSP Bug Reporter: [Problema 174.714: Nessun metodo generale per rimuovere un certifcate CA che è stato a livello di codice installato] (https://code.google.com/p/ Android/temi/dettaglio? id = 174.714). – jww

+0

@jww - Grazie per aver segnalato. –

risposta

6

Sembra che l'attuazione dell'interfaccia KeyStoreSpi proprio non supporta la rimozione:

@Override 
public void engineDeleteEntry(String alias) { 
    throw new UnsupportedOperationException(); 
} 

https://android.googlesource.com/platform/external/conscrypt/+/master/src/platform/java/org/conscrypt/TrustedCertificateKeyStoreSpi.java#81

+0

Quindi non ci sono comunque per rimuovere il certificato installato a livello di programmazione? –

+1

Probabilmente non da una normale applicazione utente. Ma puoi dare un'occhiata a come le impostazioni Android lo fanno: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.4.4_r1/com/ android/settings/TrustedCredentialsSettings.java # TrustedCredentialsSettings – Buddy

+0

Non è stato possibile importare 'IKeyChainService' e' KeyChainConnection' .. Ho ottenuto ** Impossibile risolvere l'errore di simbolo **. –

5

È possibile farlo in 5.x Android con un proprietario del dispositivo utilizzando il metodo uninstallCaCert(). Un proprietario del dispositivo può essere installato solo prima del provisioning del dispositivo.

https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#uninstallCaCert(android.content.ComponentName, byte [])

+1

È possibile utilizzare la classe' TrustedCertificateStore' e 'deleteCertificateEntry'? Il tuo [blog su ICS Trust Store] (http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html) menziona 'TrustedCertificateStore'. – jww

+0

Risposta breve: No. Risposta lunga: non è possibile fare confusione con i file di sistema senza autorizzazioni a livello di sistema. Probabilmente puoi fare qualcosa con l'accesso root, ma di solito non è una grande idea. Non sei sicuro di cosa fa l'app, ma se il certificato viene utilizzato solo dalla tua app, non installarlo affatto nell'archivio di sistema. –

+0

@Durai: * "Per controllare il traffico SSL stiamo facendo il piercing SSL ..." * - Stavo solo commentando le persone del gruppo di lavoro TLS a riguardo. O più correttamente, l'inquinamento degli standard dovuto al modello di sicurezza web/browser. Vedi [TLS: prohibit <1.2 sui client (ma permetti ai server)] (https://www.ietf.org/mail-archive/web/tls/current/msg16495.html). – jww