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

618

我有一堆" .keystore "文件,需要找到其中一个具有特定CN和别名(alias)的文件。是否有使用keytool、jarsigner或其他工具来完成这个任务的方法?我发现了一种检查特定密钥库是否用于签署特定apk的方法,但我还需要在每个文件中获取alias和证书名称。

12个回答

1132
你可以运行以下命令来列出你的密钥库文件(以及别名)的内容:
keytool -v -list -keystore /path/to/keystore

如果你正在寻找特定的别名(例如 foo),你也可以在命令中指定它:

keytool -list -keystore /path/to/keystore -alias foo

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

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


1
如果我知道密钥别名名称并且有密钥库证书和密钥库密码,那么我能显示密钥别名密码吗? - Prateek
23
你无法这么做。如果你能够通过命令行工具显示密钥库或密钥密码,那么这些密码的存在就没有多大意义了。 - user207421
3
您可以运行以下命令来列出密钥库文件的内容:keytool -list -keystore .keystore上述命令没有提供别名名称。 - Manmohan Soni
1
@ManmohanSoni 我已经更新了它,包括-v参数,这将显示别名。 - Steven Mark Ford
46
我认为对于读者来说,"/path/to/keystore"比".keystore"更加清晰明了。不管怎样,这就是正确的答案! - Andrea
显示剩余3条评论

313
为了获得所有细节,我必须将-v选项添加到romaintaz的答案中:

为了获得所有细节,我必须将-v选项添加到romaintaz的答案中:

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

10
keytool -v -list -keystore <文件名>.jks - piyush singh
1
keytool -v -list -keystore cacerts - Ankur Srivastava
2
如果指定了 -v 选项,则证书将以可读性强的格式打印,包括所有者、颁发者、序列号和任何扩展信息。 (参见:Java SE 工具参考,显示数据命令,-list 选项) - Eido95

82

你可以从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; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.security.cert.Certificate; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.util.Enumeration; - ban-geoengineering
1
@Renjith 你好,这段代码显示了除别名密码之外的所有内容,我该如何显示它呢?请帮帮我。 - Prateek
@Renjith java.security.UnrecoverableKeyException 这是当我尝试运行这段代码时抛出的异常,实际上我想要检索别名密码。 - Prateek
2
你应该在上述 while 循环中使用代码片段。 - Renjith
1
我没有Base64Encoder类。你能告诉我它在哪个jar文件中吗?还是它是一个.java文件吗? - Jack
显示剩余2条评论

64

这几乎是一个仅链接的回答。政策是您应该在回答本身中发布有关如何使用工具/库的一些信息。 - user202729
死链接,这就是为什么仅提供链接的答案很糟糕。 - Trong Nguyen

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

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

这个命令由3部分组成。如上所述,第1部分将列出所有信任的证书及其详细信息,因此第2部分仅过滤其中的别名信息。最后,在第3部分中,您可以搜索特定的别名(或其部分)。-i打开不区分大小写模式。因此,给定的命令将产生包含模式“foo”的所有别名,例如foo、123_FOO、fooBar等。有关更多信息,请参见man grep


23

这将列出所有的证书:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"

这将仅列出存储在JDK信任存储中的证书,这类似于但与密钥库(有关此问题)的目的不同。 这里有一个很好的区分:https://dev59.com/S2Mm5IYBdhLWcg3wB7Z5。 - David Levy
1
密码:changeit(默认) - Milrak Pereira Pessoa

10

命令行:

keytool -list -keystore 'keystoreName'

接着按下“Enter”键,然后命令提示符将提示您输入密钥库密码。

在输入时,命令提示符不会在屏幕上显示密码,所以只需仔细地输入正确的密码,然后再次按Enter即可。

或者,您可以使用:

keytool -list -keystore 'keystoreName' -storepass 'type your keystore passwd'

而要获取Keys的全部信息,只需添加-v:

keytool -v -list -keystore 'keystoreName' -storepass 'type your keystore passwd'

6

3
我们可以使用简单的命令从证书中获取证书列表,并在结果输出中搜索您的别名名称。
keytool -list -keystore C:/swdtools/jdk1.7.0_67/jre/lib/security/cacerts

2

1
哇!这简直是一部杰作!太棒了! - igorp1024

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接