java - 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
解决方案
读应该没有密码,只有写操作需要密码
您误解了密码的用途。密码(实际上)是密钥库的解密密钥。无论文件系统权限如何,它都可以防止未经授权的读取。
如果您希望/需要允许在没有密码的情况下读取但防止写入,您需要为此使用文件系统权限。以下问答说明了如何删除默认密码:
这是为什么控制写入(而不是读取)的密码无法工作的解释。
假设可信密钥库无需密码即可读取。然后,用户可以执行以下操作:
- 读取密钥库中的密钥
- 创建一个新的(空的)密钥库
- 将密钥写入新的密钥库
- 重命名新的密钥库,以便它替换旧的密钥库。
这可以使用自定义 Java 应用程序或(可能)标准keytool
实用程序和mv
命令来完成。
防止这种情况发生的唯一方法是阻止应用程序(或用户)通过文件系统权限将旧密钥库替换为新密钥库。如果您不能这样做(例如,因为用户具有管理员级别的访问权限),那么没有没有安全漏洞的解决方案。
推荐阅读
- excel - 如何使用 vb 将 DAX Query 提取到 CSV 中,同时用空格替换逗号
- debugging - 通过类似于 GDB readline 的起始字符搜索 LLDB 命令历史记录?
- mysql - SQL CASE WHEN (1=1) 1=1 在做什么?
- python - 在python中的点之间绘制网格线
- python - 如何使用 Selenium 和 Python 单击具有 onclick 属性的基于 javascript/AJAX 的元素
- oracle - Oracle - 获取游标中的函数参数值
- javascript - 字符串“<3”和“:)”的正则表达式模式是什么?
- c - 如何使用适用于 Windows 和 Android 的 Makefile 构建 SDL2
- sql - 使用 SQL 按时间对记录进行聚类
- linux - 如何查找目录中特定文件的磁盘使用总量