【问题标题】:How to check certificate name and alias in keystore files?如何检查密钥库文件中的证书名称和别名?
【发布时间】:2012-10-05 07:56:22
【问题描述】:

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

【问题讨论】:

    标签: java android keystore


    【解决方案1】:

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

    keytool -v -list -keystore .keystore
    

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

    keytool -list -keystore .keystore -alias foo
    

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

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

    【讨论】:

    • 嗨,如果我知道密钥别名并拥有密钥库证书和密钥库密码,我可以显示密钥别名密码
    • @prateek 你不能。如果您可以使用命令行工具进行显示,那么拥有密钥库或密钥密码就没有多大意义了。
    • 您可以运行以下命令来列出您的密钥库文件的内容: keytool -list -keystore .keystore 上面的command没有提供别名的名称
    • @ManmohanSoni 我已将其更新为包含 -v 参数,该参数显示别名
    • 我认为/path/to/keystore 而不是.keystore 对读者来说会更清楚。无论如何这是正确的答案!
    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

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

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

    更新 - 获得私钥

    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;
    • @Renjith hello 此代码显示除了与别名关联的密码之外的所有内容,我该如何显示它。请帮帮我
    • @Renjith java.security.UnrecoverableKeyException 这是我尝试这段代码时抛出的异常,实际上我想检索别名密码
    • 你应该在前面提到的while循环中使用代码sn-p
    • 我没有 Base64Encoder 类。你能告诉我它有哪个jar文件吗?还是 .java 文件?
    【解决方案4】:

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

    【讨论】:

    • 这接近于仅链接的答案。政策是您应该在答案本身中发布一些有关如何使用该工具/库的信息。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

      这将列出所有证书:

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

      【讨论】:

      【解决方案7】:

      在 Windows 上:

      keytool -v -list -keystore my_keystore | findstr my_string

      参考:

      CMD Search a directory to Find a string inside a file

      【讨论】:

        【解决方案8】:

        如果您收到警告

        Warning: use -cacerts option to access cacerts keystore

        那么你可以使用这个命令

        .\keytool.exe -list -cacerts

        【讨论】:

        • 不知道为什么这被否决了。但它很有帮助。
        【解决方案9】:

        cmd:

        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'
        

        【讨论】:

          【解决方案10】:

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

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

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

          【讨论】:

            【解决方案11】:

            keytool -v -list -cacerts -alias cert1

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

            【讨论】:

              猜你喜欢
              • 2011-08-09
              • 1970-01-01
              • 2016-04-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多