¿Cómo verificar el nombre y el alias del certificado en los archivos del almacén de claves?

410

Tengo un montón de archivos .keystore y necesito encontrar uno con CN y alias específicos. ¿Hay alguna manera de hacerlo con keytool, jarsigner o alguna otra herramienta? Encontré una forma de verificar si se utilizó un almacén de claves específico para firmar un apk específico, pero también necesito obtener el alias y el nombre del certificado en cada uno de los archivos.

Malthan
fuente

Respuestas:

720

Puede ejecutar el siguiente comando para enumerar el contenido de su archivo de almacén de claves (y el nombre de alias):

keytool -v -list -keystore .keystore

Si está buscando un alias específico, también puede especificarlo en el comando:

keytool -list -keystore .keystore -alias foo

Si no se encuentra el alias, mostrará una excepción:

error de keytool: java.lang.Exception: el alias no existe

Romain Linsolas
fuente
1
Hola puedo mostrar la contraseña de clave de alias Si me conozcan su nombre de alias y tener el certificado de almacén de claves y la contraseña del almacén de claves
Prateek
11
@prateek No puedes. No tendría mucho sentido tener un almacén de claves o contraseñas de claves si solo pudiera mostrarlas con una herramienta de línea de comandos.
Marqués de Lorne
2
Puede ejecutar el siguiente comando para enumerar el contenido de su archivo de almacén de claves: keytool -list -keystore .keystore El commond anterior no proporciona el nombre de alias
Manmohan Soni
1
@ManmohanSoni Lo he actualizado para incluir el argumento -v que revela el alias
Steven Mark Ford
10
Creo que en /path/to/keystorelugar de .keystoresería más claro para el lector. De todos modos, ¡es la respuesta correcta!
Andrea
261

Para obtener todos los detalles, tuve que agregar la opción -v a la respuesta de romaintaz:

keytool -v -list -keystore <FileName>.keystore
enkara
fuente
44
keytool -v -list -keystore <FileName> .jks
piyush singh
1
keytool -v -list -keystore cacerts
Ankur Srivastava
2
"Si -vse especifica la opción, el certificado se imprime en formato legible para el ser humano , con información adicional como el propietario, el emisor, el número de serie y cualquier extensión". (ver: Java SE Tools Reference, comando Display Data, opción -list )
Eido95
64

Puede ejecutar desde el código Java.

try {

        File file = new File(keystore location);
        InputStream is = new FileInputStream(file);
        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        String password = "password";
        keystore.load(is, password.toCharArray());


        Enumeration<String> enumeration = keystore.aliases();
        while(enumeration.hasMoreElements()) {
            String alias = enumeration.nextElement();
            System.out.println("alias name: " + alias);
            Certificate certificate = keystore.getCertificate(alias);
            System.out.println(certificate.toString());

        }

    } catch (java.security.cert.CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if(null != is)
            try {
                is.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

La clase de certificado contiene toda la información sobre el almacén de claves.

ACTUALIZACIÓN- OBTENGA CLAVE PRIVADA

Key key = keyStore.getKey(alias, password.toCharArray());
String encodedKey = new Base64Encoder().encode(key.getEncoded());
System.out.println("key ? " + encodedKey);

@prateek ¡Espero que esto sea lo que estás buscando!

Renjith
fuente
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.security.cert.Certificate; importar java.security.KeyStore; importar java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.util.Enumeration;
prohibición de geoingeniería el
1
@Renjith hello Este código muestra todo excepto la contraseña asociada con el alias. ¿Cómo puedo mostrarlo? Por favor, ayúdame
Prateek
@ Renjith, java.security.UnrecoverableKeyExceptionesta es la excepción que aparece cuando pruebo este código. Realmente quiero recuperar la contraseña de alias
Prateek
2
debe usar el fragmento de código dentro del bucle while antes mencionado
Renjith
1
No tenía la clase Base64Encoder. ¿Me puede decir qué archivo jar tiene? o es un archivo .java?
Jack
17

En un entorno similar a bash puedes usar:

keytool -list -v -keystore cacerts.jks | grep 'Alias name:' | grep -i foo

Este comando consta de 3 partes. Como se indicó anteriormente, la primera parte enumerará todos los certificados de confianza con todos los detalles y es por eso que la segunda parte solo filtra la información de alias entre esos detalles. Y finalmente, en la tercera parte, puede buscar un alias específico (o parte de él). El -i activa el modo insensible a mayúsculas y minúsculas. Por lo tanto, el comando dado generará todos los alias que contengan el patrón 'foo', fe foo, 123_FOO, fooBar, etc. Para obtener más información man grep.

Svetoslav
fuente