Detectar el certificado instalado en mi dispositivo Android

Estoy instalando un certificado en mi aplicación cuando se inicia la aplicación. He pasado por algunos de los enlaces que se muestran a continuación y con éxito instalar el certificado.

Llegué a saber que no podemos instalar el certificado en silencio sin la interacción del usuario.Actualmente no sé cómo detener la solicitud cada vez que el usuario abre mi aplicación.

Cada vez que mi aplicación se inicia actualmente cada vez que pida al usuario que instale el certificado. ¿Hay alguna manera que puedo detectar si un certificado (en este caso, mi certificado) ya está instalado o no, de forma programática.

Snippet de código en el que tengo instalado el certificado en mi aplicación

private void installCertificate() { try { BufferedInputStream bis = new BufferedInputStream(getAssets().open(MY_CERT)); byte[] keychain = new byte[bis.available()]; bis.read(keychain); Intent installIntent = KeyChain.createInstallIntent(); X509Certificate x509 = X509Certificate.getInstance(keychain); installIntent.putExtra(KeyChain.EXTRA_CERTIFICATE, x509.getEncoded()); installIntent.putExtra(KeyChain.EXTRA_NAME, MY_CERT); startActivityForResult(installIntent, INSTALL_KEYCHAIN_CODE); } catch (IOException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == INSTALL_KEYCHAIN_CODE) { switch (resultCode) { case Activity.RESULT_OK: doTheTask(); break; case Activity.RESULT_CANCELED: finish(); break; default: super.onActivityResult(requestCode, resultCode, data); } } } 

También FYI, installCertificate () se llama desde onCreate ().

Por favor, ayúdame por lo mismo. Cualquier ayuda será apreciada.


Consulta: Cuando se solicita el nombre del certificado, el texto introducido aparece como se selecciona y en la opción de cambio / cambio de orientación aparece. Cualquier cuerpo sabe cómo detener la selección de texto cuando llega el mensaje?

Utilicé debajo de un pedazo de código para verificar si mi certificado está instalado o no

 try { KeyStore ks = KeyStore.getInstance("AndroidCAStore"); if (ks != null) { ks.load(null, null); Enumeration aliases = ks.aliases(); while (aliases.hasMoreElements()) { String alias = (String) aliases.nextElement(); java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias); if (cert.getIssuerDN().getName().contains("MyCert")) { isCertExist = true; break; } } } } catch (IOException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (java.security.cert.CertificateException e) { e.printStackTrace(); } 

Añadir alguna información adicional a la respuesta de @ Android (no puedo comentar aún), cuyo código funcionó para mí solo en dispositivos con Android 4.0 o superior.

Para los dispositivos pre IceCream Sandwich (API <14):

 boolean isCertExist; TrustManagerFactory tmf; try { tmf = TrustManagerFactory.getInstance(TrustManagerFactory .getDefaultAlgorithm()); tmf.init((KeyStore) null); X509TrustManager xtm = (X509TrustManager) tmf.getTrustManagers()[0]; for (X509Certificate cert : xtm.getAcceptedIssuers()) { if (cert.getIssuerDN().getName().contains("MyCert")) { isCertExist = true; break; } } } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KeyStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Para dispositivos con Android 4.0 y versiones posteriores (API> = 14):

 boolean isCertExist; try { KeyStore ks = KeyStore.getInstance("AndroidCAStore"); if (ks != null) { ks.load(null, null); Enumeration aliases = ks.aliases(); while (aliases.hasMoreElements()) { String alias = (String) aliases.nextElement(); java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias); if (cert.getIssuerDN().getName().contains("MyCert")) { isCertExist = true; break; } } } } catch (IOException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (java.security.cert.CertificateException e) { e.printStackTrace(); } 

KeyChain.createInstallIntent, la intención creada llamará a android.security.certinstaller para instalar certificados y, a continuación, el certinstaller imprimirá el registro cuando se instalen los certificados. Por lo que puede volcar el registro de cat para comprobar si el certificado está instalado o no. (Puede obtener el alias si el usuario cambió el nombre de la tienda de certificado)

Lectura de una tienda de confianza de la CA como se muestra a continuación

 KeyStore ks = KeyStore.getInstance("AndroidCAStore"); 

Sólo obtendrá los certificados de CA y no los certificados de usuario / cliente. No es necesario que el certificado de cliente comparta el mismo alias que el certificado de la entidad emisora ​​de certificados.

  • Vista web android con certificado de cliente
  • Listando todos los certificados instalados en android
  • Dónde encontrar el usuario instalado certificado android 4.0 y superior
  • ¿Cómo forzar la desinstalación de la aplicación para actualizarla?
  • Uso de la versión personalizada de la aplicación de App Engine en Android
  • Error al generar el archivo final: el certificado de depuración expiró el
  • Instalación del certificado de Android
  • ¿Cómo comprobar si APK está firmado o "debug build"?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.