如何检查密钥库文件中的证书名称和别名?


410

我有一堆.keystore文件,需要找到一个具有特定CN和别名的文件。有没有办法使用keytool,jarsigner或其他工具来做到这一点?我找到了一种检查特定密钥库是否用于签名特定apk的方法,但是我还需要在每个文件中获取别名和证书名称。

Answers:


720

您可以运行以下命令来列出密钥库文件的内容(和别名):

keytool -v -list -keystore .keystore

如果要查找特定的别名,也可以在命令中指定它:

keytool -list -keystore .keystore -alias foo

如果找不到别名,它将显示异常:

keytool错误:java.lang.Exception:别名不存在


1
嗨,我可以显示密钥别名密码吗?如果我知道密钥别名的名称,并且拥有密钥库证书和密钥库密码
Prateek

11
@prateek不能。如果只可以使用命令行工具进行显示,那么拥有密钥库或密钥密码就没有多大意义了。
罗恩侯爵

2
您可以运行下面的命令列出密钥库文件的内容:密钥工具-list -keystore的.keystore以上commond未提供别名的名称
曼莫汉瑞里

1
@ManmohanSoni我已经对其进行了更新,以包含显示别名的-v参数
Steven Mark Ford

10
我认为这/path/to/keystore不是.keystore会更清楚地向读者。无论如何,这是正确的答案!
安德里亚(Andrea)'18

261

为了获得所有详细信息,我必须在romaintaz答案中添加-v选项:

keytool -v -list -keystore <FileName>.keystore

4
keytool -v -list -keystore <FileName> .jks
piyush singh

1
keytool -v -list -keystore cacerts
Ankur Srivastava

2
“如果-v指定了该选项,那么证书将以人类可读的格式打印,并带有所有者,发行者,序列号和任何扩展名等其他信息。” (请参阅:《Java SE工具参考》,“显示数据”命令,-list选项
Eido95 '17

64

您可以从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();
            }
    }

证书类包含有关密钥库的所有信息。

更新-获取私钥

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

@prateek希望这是您想要的!


导入java.io.File; 导入java.io.FileInputStream; 导入java.io.FileNotFoundException; 导入java.io.IOException; 导入java.security.cert.Certificate; 导入java.security.KeyStore; 导入java.security.KeyStoreException; 导入java.security.NoSuchAlgorithmException; 导入java.util.Enumeration;
ban-geoengineering

1
@Renjith hello这段代码显示除与别名关联的密码外的所有内容,我该如何显示它。请帮助我
Prateek

@Renjith java.security.UnrecoverableKeyException这是我实际尝试获取别名密码时尝试抛出的异常
Prateek

2
您应该在上述while循环内使用代码段
Renjith 2013年

1
我没有Base64Encoder类。你能告诉我它有哪个jar文件吗?还是.java文件?
2016年


17

在类似bash的环境中,可以使用:

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

该命令包括3个部分。如上所述,第一部分将列出具有所有详细信息的所有受信任证书,这就是第二部分开始仅过滤那些详细信息中的别名信息的原因。最后,在第3部分中,您可以搜索特定的别名(或其中的一部分)。该-i轮流在不区分大小写模式。因此,给定的命令将产生包含模式'foo',fe foo,123_FOO,fooBar等的所有别名。有关更多信息man grep


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.