【问题标题】:java keystore and password settingsjava 密钥库和密码设置
【发布时间】:2011-06-23 00:21:27
【问题描述】:

我有以下关于 java 密钥库和 keytool 的问题。我假设一个密钥库可能有超过 1 个证书。正如我所尝试的,通过 keytool 我可以创建一个密钥库,并且要访问这个密钥库,我必须设置一个密码。此外,要访问每个证书条目,我必须设置一个密码。密钥库和条目是否必须使用相同的密码?如果不是(我认为这样假设是合理的)为什么是以下代码:

char[] pwd = new char[]{'s','e','c','r','e','t'};
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream("myPersonal.keystore"), pwd);
kmf.init(ks, pwd);//fails here with exception

给我以下异常?

Exception in thread "main" java.security.UnrecoverableKeyException: Cannot recover key
    at sun.security.provider.KeyProtector.recover(Unknown Source)
    at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source)
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source)
    at java.security.KeyStore.getKey(Unknown Source)

secret 是访问我通过 keytool 创建的密钥库 myPersonal.keystore 的密码。其中有 2 个条目,用于证书,1 个 DSA 和 1 个 RSA。每个人都有一个与密钥库(以及彼此)不同的密码。现在代码是正确的,因为如果我使用具有与密钥库相同密码的单个证书条目的密钥库,则没有异常并且程序运行正常。

那么这里的问题是什么?我不应该有不同的密码?我不应该有很多证书吗?还是什么?

【问题讨论】:

    标签: java security ssl digital-certificate keytool


    【解决方案1】:

    根据 API 的规定,KeyManagerFactory.init 方法接收用于从密钥库中检索密钥的密​​码。由于只有一个密码参数,因此期望所有密钥的密码都相同。如果其中一个密钥使用了不同的密码,则会收到错误,因为该特定密钥库条目的密码不正确。

    对您来说最简单的解决方案是对密钥库中的所有条目使用相同的密码。如果您设置为每个条目维护不同的密码,那么您可能需要考虑构建自己的自定义安全元素,例如 KeyManager。

    【讨论】:

    • 所以你是说这是一个隐含的要求?有什么理由在 KeyManagerFactory 中强制这个限制吗?我假设在实际场景中,常见的情况是使用不同的密码
    • KeyManagerFactory的API定义是隐含的。我假设创建 API 是为了处理最简单的场景,即所有密钥都具有相同的密码。 KeyManagerFactory 是一种简单的机制,涵盖了可能使用的更常用方法(我尚未验证)。 KeyStore API 确实允许您使用不同的密码访问不同的密钥,这允许您为更复杂的场景扩展功能。至于 API 定义背后的原因……很难说。
    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2018-08-06
    • 2015-10-07
    • 2016-07-13
    相关资源
    最近更新 更多