【问题标题】:Can I create a Java trust store without a password using keytool?我可以使用 keytool 创建一个没有密码的 Java 信任库吗?
【发布时间】:2016-07-06 21:31:23
【问题描述】:

我想使用自签名证书连接到 TLS 服务器,因此我需要一个自定义信任库。 keytool 似乎绝对需要密码才能导入证书,但我真的不需要密码保护信任库。使用标准密码“changeit”可以,但我宁愿完全没有密码。

请注意,这是一个“信任库”而不是“密钥库”,因此信任库中根本没有秘密材料:只有服务器的证书,因此客户端可以验证服务器是受信任的。

keytool 可以做到这一点吗?是否有其他工具可以从信任库中删除密码?了解对信任库进行身份验证实际上可能有其用途,是否有任何具体原因说明我应该在没有密码的情况下使用信任库?

【问题讨论】:

标签: java ssl keytool truststore


【解决方案1】:

如果你创建一个新的信任库,我很确定 keytool 会让你输入一个空白密码,但是没有密码的问题是攻击者可以插入他们想要的任何证书并让它受到信任。这会产生恶意机会,例如 man-in-the-middle attack。您的应用程序假定它可以信任攻击者设置的 URL,因此没有什么可以阻止他们重新路由您的 Web 服务调用。

在生产环境中更改您的密钥库和信任库密码绝对是最佳实践。

【讨论】:

  • 我的立场是,由于信任存储密码在配置和/或代码中是显而易见的,那么信任存储很容易被处于特权位置的攻击者篡改,所以添加信任存储密码并没有真正购买任何额外的安全性。例如,大多数 *NIX 系统都有一大堆 PEM 文件代表系统的信任存储,它们不受文件权限以外的任何保护。为什么我的应用程序的信任库应该有所不同?
  • keytool 不允许使用空白密码,至少当前版本的 keytool 不允许(撰写本文时为 Java 1.8)。
  • 其他工具(和原始 Java 代码)可以使用空白密码。此外,即使密钥库本身有密码,您也可以在没有密码的情况下读取密钥库的非私有项目(例如证书)。您只会收到来自keytool 的警告,即无法验证密钥库的完整性。
  • 这很奇怪,因为我可以在没有密码的情况下使用keytool -list 很好地访问我的密钥库,但是当我尝试在其中导入新文件时需要我输入密码。我很确定这个密钥库中没有密码,所以我正在尝试导入空白。