keytool 在 Ubuntu 中不工作:不正确的魔法
keytool not working in Ubuntu: incorrect magic
我使用 Ubuntu 16.04 LTS。当我在
$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 提供的真实 keytool
,方法是:
cd $JAVA_HOME/bin/
和,
./keytool -list -keystore <full/path/to/cacerts>
请注意 ./
部分至关重要。
当然,在使用系统变量$JAVA_HOME
之前,你必须先设置它。首先通过
在存在的变量中查找
env | grep -i java_home
-i
表示 "case insensitive".
如果returns什么都没有,那么
export JAVA_HOME=<path/to/your/jdk/installation/directory/>
(export
仅设置会话范围的环境变量。一旦关闭此终端,此处设置的值将不再起作用。对于设置
- 仅限此用户,
- 用户范围,除了
su
、
- 用户范围,包括
su
、
- 全系统且仅 shell,
- 系统范围内的所有应用程序,以及
- 系统范围的语言环境变量,
一定要读这个link:https://help.ubuntu.com/community/EnvironmentVariables)
我使用 Ubuntu 16.04 LTS。当我在
$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 提供的真实
keytool
,方法是:cd $JAVA_HOME/bin/
和,./keytool -list -keystore <full/path/to/cacerts>
请注意 ./
部分至关重要。
当然,在使用系统变量$JAVA_HOME
之前,你必须先设置它。首先通过
env | grep -i java_home
-i
表示 "case insensitive".
如果returns什么都没有,那么
export JAVA_HOME=<path/to/your/jdk/installation/directory/>
(export
仅设置会话范围的环境变量。一旦关闭此终端,此处设置的值将不再起作用。对于设置
- 仅限此用户,
- 用户范围,除了
su
、 - 用户范围,包括
su
、 - 全系统且仅 shell,
- 系统范围内的所有应用程序,以及
- 系统范围的语言环境变量,
一定要读这个link:https://help.ubuntu.com/community/EnvironmentVariables)