【发布时间】:2012-10-05 07:56:22
【问题描述】:
我有一堆 .keystore 文件,需要找到一个具有特定 CN 和别名的文件。有没有办法使用 keytool、jarsigner 或其他工具来做到这一点?我找到了一种方法来检查是否使用特定的密钥库来签署特定的 apk,但我还需要获取每个文件中的别名和证书名称。
【问题讨论】:
我有一堆 .keystore 文件,需要找到一个具有特定 CN 和别名的文件。有没有办法使用 keytool、jarsigner 或其他工具来做到这一点?我找到了一种方法来检查是否使用特定的密钥库来签署特定的 apk,但我还需要获取每个文件中的别名和证书名称。
【问题讨论】:
您可以运行以下命令来列出您的密钥库文件的内容(和别名):
keytool -v -list -keystore .keystore
如果要查找特定别名,也可以在命令中指定:
keytool -list -keystore .keystore -alias foo
如果找不到别名,则会显示异常:
keytool 错误:java.lang.Exception:别名不存在
【讨论】:
/path/to/keystore 而不是.keystore 对读者来说会更清楚。无论如何这是正确的答案!
为了获得所有详细信息,我必须在 romaintaz 答案中添加 -v 选项:
keytool -v -list -keystore <FileName>.keystore
【讨论】:
-v 选项,则证书以人类可读格式打印,并附有所有者、颁发者、序列号和任何扩展。” (见:Java SE Tools Reference, Display Data command, -list option)
您可以从 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.security.UnrecoverableKeyException 这是我尝试这段代码时抛出的异常,实际上我想检索别名密码
KeyStore Explorer 用于管理密钥库的开源可视化工具。
【讨论】:
在类似 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。
【讨论】:
这将列出所有证书:
keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
【讨论】:
在 Windows 上:
keytool -v -list -keystore my_keystore | findstr my_string
参考:
【讨论】:
如果您收到警告
Warning: use -cacerts option to access cacerts keystore
那么你可以使用这个命令
.\keytool.exe -list -cacerts
【讨论】:
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'
【讨论】:
还有控制台证书管理器编写为单文件 shell 脚本(开源):
https://dev.to/sfkulyk/writing-panel-manager-for-certificate-keystore-in-linux-shell-187b
可以浏览、复制、删除、重命名和比较密钥库。
【讨论】:
keytool -v -list -cacerts -alias cert1
当我使用别名检查添加到 jdk-11 的证书并检查它是否已添加到 Windows 机器上时,这对我有用
【讨论】: