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

Mal*_*han 376 java android keystore

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

Rom*_*las 650

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

keytool -v -list -keystore .keystore
Run Code Online (Sandbox Code Playgroud)

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

keytool -list -keystore .keystore -alias foo
Run Code Online (Sandbox Code Playgroud)

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

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

  • @prateek你不能.如果您可以使用命令行工具显示密钥库或密钥密码,那么没有多大意义. (10认同)
  • 我认为`/ path/to/keystore`而不是`.keystore`会让读者更清楚.无论如何,这是正确的答案! (6认同)
  • 您可以运行以下命令列出密钥库文件的内容:keytool -list -keystore .keystore上面的commond没有提供别名的名称 (2认同)

enk*_*ara 251

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

keytool -v -list -keystore <FileName>.keystore
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这应该是答案. (15认同)
  • keytool -v -list -keystore <FileName> .jks (3认同)
  • “如果指定了-v选项,则证书将以**可读格式打印,并带有所有者,发行者,序列号和任何扩展名等附加信息。” (请参阅:[Java SE工具参考,显示数据命令,-列表选项](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html#keytool_option_list)) (2认同)

Ren*_*ith 61

您可以从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();
            }
    }
Run Code Online (Sandbox Code Playgroud)

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

更新 - 获得私钥

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

@prateek希望这就是你要找的!

  • 你应该在前面提到的while循环中使用代码片段 (2认同)

小智 56

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


Sve*_*lav 16

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

keytool -list -v -keystore cacerts.jks | grep 'Alias name:' | grep -i foo
Run Code Online (Sandbox Code Playgroud)

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


Wal*_*alk 11

这将列出所有证书:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
Run Code Online (Sandbox Code Playgroud)


小智 10

命令:

keytool -list -keystore 'keystoreName'
Run Code Online (Sandbox Code Playgroud)

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

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

或者您可以使用:

keytool -list -keystore 'keystoreName' -storepass 'type your keystore passwd'
Run Code Online (Sandbox Code Playgroud)

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

keytool -v -list -keystore 'keystoreName' -storepass 'type your keystore passwd'
Run Code Online (Sandbox Code Playgroud)


Mat*_*ntz 6

在 Windows 上:

keytool -v -list -keystore my_keystore | keytool -v -list -keystore my_keystore | findstr my_string

参考:

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