2011-05-17 55 views
0

所以,这是我拍摄的场景。是否有可能从无签名的java代码访问密钥库中的密钥?

我有一个应用程序服务器。在该应用程序服务器上是受密码保护的密钥库文件。密钥库文件内部是一个私钥,必须通过编程方式从已部署的战争文件中访问。

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

战争文件是建立在一个单独的开发机器上。在构建时,提供一个开发人员私钥,签署战争文件。

说开发者的公共证书已被导入到应用程序服务器的密钥库信任证书中。

从代码中,我希望能够加载密钥库并检索私钥,而不必为密钥提供密码。我希望让由可信证书签名的代码具有足够的身份验证能够成功检索密钥。

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

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

+0

我没有得到你的问题,但是这似乎涉及: [链接](http://stackoverflow.com/questions/4926290/java-keystore-and-password-settings) 很抱歉,如果我错了这里。 – Sid 2011-05-17 22:11:29

+0

从我的评论中收集到的另一个解决方案是将JNDI与您的应用服务器结合使用。因此,您不必在代码中保存密码。 – Sid 2011-05-17 22:15:14

回答

1

您无法在没有密码的情况下以“Java密钥库”格式密钥存储区检索您的私钥。

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

尽管您不需要将私钥存储在Java密钥库中。例如,您可以将其存储在未加密的文件中。或者,如果您需要与现有代码兼容,则可以实施您自己的Provider并创建不使用加密的KeyStore实现。大多数需要KeyStore支持选项的应用程序可以控制提供程序和实例化的密钥存储的类型。

在上述任何一种方法中,您都完全依赖操作系统的文件权限来限制对私钥的访问。

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

+1

这就是我所害怕的。我不想将密码存储在文件系统的任何物理位置,因为如果它位于文件系统上,它很容易受到攻击。我只是希望有另一种方式。 – 2011-05-18 01:15:31

0

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