我有一个使用keytool生成2个密钥的JKS。 2个密钥具有不同的密码,JKS密码再次与这2个密码不同。
如果密钥库中只有一个密钥,则按预期工作。但是使用不同的密码添加另一个密码会产生UnrecoverableKeyException
。如果两个密钥具有相同的密码,它仍然可以正常工作。
查看与此相关的一些问题:Java keystore with multiple keys and different passwords,Caused by: java.security.UnrecoverableKeyException: Cannot recover key似乎解决方案是使用相同的密码。但这意味着能够为不同的密钥设置不同的密码是没有意义的;我们可以设置一个密码到整个密钥库,并保留它。
查看Tomcat,它似乎也遵循这种方法,即对商店和密钥使用相同的密码。
这是JDK强加的限制吗?难道没有办法让不同的密钥使用不同的密码吗?
答案 0 :(得分:3)
这不是JDK的限制,JSSE Reference Guide回答了您的问题:
对于许多工厂,例如默认的SunX509 KeyManagerFactory SunJSSE提供商,KeyStore和密码是唯一的 初始化KeyManagerFactory所需的信息,因此 第一个init方法是适当的调用方法。该 KeyManagerFactory将查询KeyStore以获取有关哪些信息 应使用私钥和匹配的公钥证书 验证远程套接字对等体。密码参数 指定将与方法一起使用的密码 从KeyStore访问密钥。 KeyStore中的所有密钥必须是 受相同密码保护。
有时候KeyStore和密码以外的初始化参数 提供者需要。预计该提供商的用户将通过 适当的ManagerFactoryParameters的实现 由提供商定义。然后提供者可以调用指定的 在ManagerFactoryParameters实现中获取的方法 需要的信息。
您现在知道该怎么做,实现自己的ManagerFactoryParameters。但是如果你还要改变Tomcat的代码,那就另外做了。