首页 > 解决方案 > keytool 要求输入密码以读取 java 证书 ubuntu 18.04

问题描述

我全新安装了 ubuntu 18.04。我的构建(例如 Maven 和 Gradle)访问存储库 https 时遇到问题,它显示的消息是:

java.security.InvalidAlgorithmParameterException:trustAnchors 参数必须为非空

当我尝试使用以下命令从我的密钥库访问证书时:

keytool -list -keystore /etc/ssl/certs/java/cacerts

提示我输入密码,这不是问题,但如果我只是按 Enter 而不输入密码,它不会显示任何条目。

如果我输入密码,所有证书都会正常显示。我必须做的是向我的所有 Java 应用程序添加以下系统属性:javax.net.ssl.trustStorePassword=changeit

然后一切正常。我做错了什么?

编辑:

这是现在对 cacerts 的许可:

-rw-r--r-- 1 root root 167K jun  8 11:21 /etc/ssl/certs/java/cacerts

所以每个人都可以阅读。如果我尝试使用没有密码的列表:

keytool -list -keystore /etc/ssl/certs/java/cacerts                                                                             ✔  308  10:27:15 
Enter keystore password:  

*****************  WARNING WARNING WARNING  *****************
* The integrity of the information stored in your keystore  *
* has NOT been verified!  In order to verify its integrity, *
* you must provide your keystore password.                  *
*****************  WARNING WARNING WARNING  *****************

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 0 entries

with the password:keytool -list -keystore /etc/ssl/certs/java/cacerts                                                                             ✔  310  10:36:33 
Enter keystore password:  
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 134 entries

标签: javaubuntu-18.04keystore

解决方案


读应该没有密码,只有写操作需要密码

您误解了密码的用途。密码(实际上)是密钥库的解密密钥。无论文件系统权限如何,它都可以防止未经授权的读取。

如果您希望/需要允许在没有密码的情况下读取但防止写入,您需要为此使用文件系统权限。以下问答说明了如何删除默认密码:


这是为什么控制写入(而不是读取)的密码无法工作的解释。

假设可信密钥库无需密码即可读取。然后,用户可以执行以下操作:

  • 读取密钥库中的密钥
  • 创建一个新的(空的)密钥库
  • 将密钥写入新的密钥库
  • 重命名新的密钥库,以便它替换旧的密钥库。

这可以使用自定义 Java 应用程序或(可能)标准keytool实用程序和mv命令来完成。

防止这种情况发生的唯一方法是阻止应用程序(或用户)通过文件系统权限将旧密钥库替换为新密钥库。如果您不能这样做(例如,因为用户具有管理员级别的访问权限),那么没有没有安全漏洞的解决方案。


推荐阅读