【问题标题】:why does a JKS load work even when we supply null password?为什么即使我们提供空密码,JKS 加载也会起作用?
【发布时间】:2017-02-21 08:52:53
【问题描述】:

我有一个使用密码生成的JKS 文件。我有一个使用 keystore 连接到 url 的 java 代码。现在,当我加载密钥库时,我错误地将 密码 传递为 null。但令我惊讶的是,连接仍然通过。

KeyStore store = KeyStore.getInstance("JKS");
store.load(stream, null);

我觉得这种行为很可疑。有对此的解释吗?

编辑:

如果此行为符合预期,那么为什么在通过 keytool 创建密钥库时需要密码?

【问题讨论】:

  • 您是否确实连接到https 站点(以排除仅在实际需要时才使用密码)?
  • 是的,我连接到HTTPS 站点!

标签: java security ssl keystore jks


【解决方案1】:

如果您不提供密码:

  1. 密钥库在打开时未进行完整性检查。
  2. 您无法访问任何私钥条目。

对于用作信任库KeyStore,即只包含受信任的证书,这是一种正常用法。

如果此行为符合预期,那么为什么在通过 keytool 创建密钥库时需要密码?

这样您就可以在打开时提供一个,从而获得上述(1)或(2)处的行为。

【讨论】:

  • 能否详细说明第二点?如何在密钥库中添加私钥?另外,将其用作 trustStore 时的正常用法是什么?是带密码还是不带密码?
  • 您通过 API 或 keytool 将私钥添加到密钥库。信任库不提供密码是正常用法,这就是您的问题所在。我不明白你为什么要问这些问题。
【解决方案2】:

嗯,我认为您传递的密码是为了确保密钥库本身的完整性(在更改内容本身时)。但是,如果没有提供密码,内容(密钥/证书)仍然可以读取 - 这就是您所遇到的。

出于说明目的,您还可以通过运行以下命令查看密钥库的内容:keytool -list -keystore <keystore> - 这并不意味着将密码短语传递给密钥库本身。

您还可以在此处阅读与 KeyStore 对象上的 load() 函数本身相关的更多信息:http://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html#load(java.io.InputStream,%20char[])

stream - 从中​​加载密钥库的输入流,或 null

password - 用来检查keystore完整性的密码,用来解锁keystore的密码,或者为null

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多