526

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

4

11 回答 11

944

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

keytool -v -list -keystore .keystore

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

keytool -list -keystore .keystore -alias foo

如果找不到别名,则会显示异常:

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

于 2012-10-15T11:08:30.997 回答
292

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

keytool -v -list -keystore <FileName>.keystore
于 2015-04-17T11:57:43.807 回答
73

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

@pratek 希望这就是你要找的东西!

于 2012-10-15T11:29:44.090 回答
63

KeyStore Explorer 用于管理密钥库的开源可视化工具。

于 2014-02-18T14:13:38.113 回答
22

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

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

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

于 2016-11-01T11:52:41.840 回答
20

这将列出所有证书:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
于 2017-03-19T15:30:14.577 回答
4

在 Windows 上:

keytool -v -list -keystore my_keystore | findstr my_string

参考:

CMD 搜索目录以在文件中查找字符串

于 2021-09-01T12:46:15.750 回答
1

如果您收到警告

Warning: use -cacerts option to access cacerts keystore

那么你可以使用这个命令

.\keytool.exe -list -cacerts

于 2021-11-30T10:02:36.827 回答
0

还有控制台证书管理器编写为单文件 shell 脚本(开源):

https://dev.to/sfkulyk/writing-panel-manager-for-certificate-keystore-in-linux-shell-187b

可以浏览、复制、删除、重命名和比较密钥库。

于 2021-03-25T16:04:54.003 回答
0

命令:

keytool -list -keystore 'keystoreName'

然后按“Enter”,cmd将提示您输入密钥库密码

cmd 在输入时不会在屏幕上显示密码,因此只需输入正确的密码 - 并小心 - 然后再次按 enter。

或者您可以使用:

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

对于 Keys 的完整信息,只需添加 -v:

keytool -v -list -keystore 'keystoreName' -storepass 'type your keystore passwd'
于 2022-01-24T22:14:08.113 回答
0

keytool -v -list -cacerts -alias cert1

当我检查使用别名添加到 jdk-11 的证书并检查它是否已添加到 Windows 机器上时,这对我有用

于 2022-02-23T18:12:00.280 回答