【问题标题】:Is it possible to access keys in a keystore from signed java code without a password?是否可以在没有密码的情况下从签名的 java 代码访问密钥库中的密钥?
【发布时间】:2011-05-17 22:09:24
【问题描述】:

所以,这就是我要拍摄的场景。

我有一个应用服务器。该应用程序服务器上有一个受密码保护的密钥库文件。在密钥库文件中是一个私钥,我必须以编程方式从已部署的 war 文件中获得访问权限。

我不想在我的代码中存储密码。

war 文件构建在单独的开发人员机器上。在构建时,会提供开发者私钥,用于对 war 文件进行签名。

所述开发者的公共证书已被导入到应用服务器的密钥库可信证书中。

在代码中,我希望能够加载密钥库并检索私钥,而无需提供密钥的密码。我希望通过受信任的证书签名的代码足以进行身份​​验证以成功检索密钥。

如果恶意用户获得对应用程序服务器的访问权限,他们将无法修改签名代码,因为这会破坏签名。他们也无法部署自己的代码,因为他们没有受信任的私钥。最后,他们无法将自己的证书作为可信证书导入密钥库,因为他们没有密钥库密码。

这可能吗?如果没有,那为什么不呢?

【问题讨论】:

  • 我没有收到您的问题,但这似乎与此有关:link 抱歉,如果我在这里错了。
  • 我从您的 cmets 收集到的另一个解决方案是将 JNDI 与您的应用服务器一起使用。因此,您不必在代码中保存密码。

标签: java security keystore


【解决方案1】:

如果没有密码,您无法在“Java Key Store”格式的密钥库中检索您的私钥。

它与“身份验证”无关。在 JKS 文件中,私钥是加密的,密码就是密钥。如果没有该密钥,就无法恢复私钥。

不过,您不必将私钥存储在 Java 密钥库中。例如,您可以将其存储在未加密的文件中。

或者,如果您需要与现有代码兼容,您可以实现自己的Provider 并创建一个不使用加密的KeyStore 实现。大多数需要KeyStore 的应用程序都支持选项来控制实例化的密钥存储的提供者和类型。

在这两种方法中,您仅依靠操作系统的文件权限来限制对私钥的访问。

更安全的方法是让应用程序在启动时提示输入密码。

【讨论】:

  • 这就是我所害怕的。我不想将密码存储在文件系统上的任何物理位置,因为如果它在文件系统上,它很容易受到攻击。我只是希望有另一种解决方法。
【解决方案2】:

没有办法将应用程序由特定证书的密钥签名这一事实转化为能够访问密钥库文件。您可以做的最好的事情是通过其他方式向应用程序提供密钥库的密码 - 使用属性或 JNDI 或配置文件或类似的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多