Como verificar o nome e o alias do certificado nos arquivos de armazenamento de chaves?

410

Eu tenho um monte de arquivos .keystore e preciso encontrar um com CN e alias específicos. Existe uma maneira de fazê-lo com keytool, jarsigner ou alguma outra ferramenta? Encontrei uma maneira de verificar se keystore específico foi usado para assinar um apk específico, mas também preciso obter o alias e o nome do certificado em cada um dos arquivos.

Malthan
fonte

Respostas:

720

Você pode executar o seguinte comando para listar o conteúdo do seu arquivo keystore (e nome alternativo):

keytool -v -list -keystore .keystore

Se você estiver procurando por um alias específico, também poderá especificá-lo no comando:

keytool -list -keystore .keystore -alias foo

Se o alias não for encontrado, ele exibirá uma exceção:

erro da ferramenta-chave: java.lang.Exception: o alias não existe

Romain Linsolas
fonte
1
Oi eu posso exibir a senha de chave apelido Se eu sei o nome da chave alias e tem certificado de armazenamento de chave e senha de armazenamento de chaves
Prateek
11
@prateek Você não pode. Não faria muito sentido ter keystore ou senhas de chave se você pudesse apenas exibi-las com uma ferramenta de linha de comando.
Marquês de Lorne
2
Você pode executar o seguinte comando para listar o conteúdo do seu arquivo keystore: keytool -list -keystore .keystore O commond acima não está fornecendo o nome do alias
Manmohan Soni
1
@ManmohanSoni eu tenha atualizado para incluir -v argumento que revela o apelido
Steven Mark Ford
10
Eu acho que ao /path/to/keystoreinvés de .keystoreseria mais claro para o leitor. Enfim, é a resposta correta!
Andrea
261

Para obter todos os detalhes, tive que adicionar a opção -v à resposta romaintaz:

keytool -v -list -keystore <FileName>.keystore
enkara
fonte
4
keytool -v -list -keystore <FileName> .jks
piyush singh
1
keytool -v -list -keystore cacerts
Ankur Srivastava
2
"Se a -vopção for especificada, o certificado será impresso em formato legível por humanos , com informações adicionais, como proprietário, emissor, número de série e quaisquer extensões". (ver: Java SE Ferramentas de Referência, exibição de comando de dados, opção -list )
Eido95
64

Você pode executar a partir do 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();
            }
    }

A classe de certificado contém todas as informações sobre o keystore.

ATUALIZAÇÃO- OBTENHA CHAVE PRIVADA

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

@prateek Espero que seja isso que você está procurando!

Renjith
fonte
importar java.io.File; importar java.io.FileInputStream; importar java.io.FileNotFoundException; importar java.io.IOException; importar java.security.cert.Certificate; importar java.security.KeyStore; importar java.security.KeyStoreException; importar java.security.NoSuchAlgorithmException; importar java.util.Enumeration;
ban-geoengineering
1
@Renjith hello Este código exibe tudo, exceto a senha associada ao alias, como posso exibi-lo. Por favor me ajude
Prateek
@Renjith java.security.UnrecoverableKeyExceptionesta é a exceção lançada quando tento este código actualy Quero recuperar senha apelido
Prateek
2
você deve usar o trecho de código dentro do loop while acima mencionada
Renjith
1
Eu não tinha a classe Base64Encoder. Você pode me dizer qual arquivo jar possui? ou é um arquivo .java?
Jack
58

Ferramenta visual de código aberto do KeyStore Explorer para gerenciar keystores.

Ycnannamela
fonte
17

Em um ambiente semelhante ao bash, você pode usar:

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

Este comando consiste em 3 partes. Conforme declarado acima, a parte listará todos os certificados confiáveis ​​com todos os detalhes e é por isso que a parte filtra apenas as informações de alias entre esses detalhes. E finalmente, na parte, você pode procurar um alias específico (ou parte dele). O -i ativa o modo que não diferencia maiúsculas de minúsculas. Assim, o comando fornecido produzirá todos os aliases que contêm o padrão 'foo', fe foo, 123_FOO, fooBar, etc. Para obter mais informações man grep.

Svetoslav
fonte
12

Isso listará todos os certificados:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
Andar
fonte
Isso listará apenas os certificados armazenados no armazenamento confiável do JDK que são semelhantes, mas com uma finalidade diferente de um keystore (sobre o qual foi perguntado). Há uma boa diferenciação aqui: http://stackoverflow.com/questions/17935619/what-is-difference-between-cacerts-and-keystore .
David Levy