我是Ubuntu16.04LTS的。当我在里面的时候

$JAVA_HOME/jre/lib/security

并希望使用以下命令在cacerts中列出证书:
keytool -list -keystore cacerts

它提示我输入密码,因此我输入默认密码:
changeit

出现异常:
keytool error: gnu.javax.crypto.keyring.MalformedKeyringException: incorrect magic

为什么会这样?

最佳答案

如果发生这种情况,您可以尝试这样做,以了解keytool真正代表什么。

keytool -version

如果它给你这样的输出:
Unrecognized command: -version
Usage:  keytool [COMMAND] [-- COMMAND]...
Manage private keys and public certificates.

Available commands:
....

试试这个:
update-alternatives --display keytool

如果你看过这个:
keytool - AUTO
link best version is /usr/bin/gkeytool-5
link points to /usr/bin/gkeytool-5
link keytool is /usr/bin/keytool
slave keytool.1.gz is /usr/share/man/man1/keytool.1.gz
/usr/bin/gkeytool-5 - priority 1050
secondary keytool.1.gz:/usr/share/man/man1/gkeytool-5.1.gz

现在你知道keytool实际上并不是指向$JAVA_HOME/bin/keytool,而是指向类似但不同的东西,这是ubuntu的本机,名为gkeytool,它提供相同的功能,但在这种特定情况下会失败。
所以,你可以:
要不消除gkeytool,请使用update-alternatives更改关键字keytool,使其指向$JAVA_HOME/bin/keytool,该关键字应处于优先级0。使用update-alternatives -help查看完整语法。
或者,您可以通过以下方式访问jdk提供的realkeytool
cd $JAVA_HOME/bin/
而且,
./keytool -list -keystore <full/path/to/cacerts>
注意./部分至关重要。
当然,在使用系统变量$JAVA_HOME之前,必须对其进行设置。首先,在现有变量中查找它。
env | grep -i java_home

-i表示“不区分大小写”。
如果它什么也不返回,那么
export JAVA_HOME=<path/to/your/jdk/installation/directory/>

export仅设置会话范围的环境变量。关闭此终端后,此处设置的值将不再工作。用于设置
仅此用户,
用户范围,除了su
用户范围,包括su
全系统和仅限外壳,
适用于所有应用程序的系统范围,以及
系统范围内的语言环境变量,
请务必阅读此链接:https://help.ubuntu.com/community/EnvironmentVariables

关于java - keytool在Ubuntu中不起作用:错误的魔术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39596452/

10-12 02:43