2012-07-18 159 views
0

使用load()方法创建后,将初始化密钥库(无论它用于“密钥库”还是“信任库”)。一个版本需要对应于密钥库文件的InputStream以及解密该文件的密码。以编程方式向方法提供密码对我来说似乎很陌生。密钥库的密码管理

例如,服务器使用密钥库来存储其私钥和相关证书。密钥存储中的信息是明智的,因此它受密码保护。以编程方式将密码传递给load()方法有什么问题?最佳做法是什么?

另一个例子,但现在关于信任库。客户端有一个存储受信任CA证书的信任库。据我了解,信任库不包含服务器的证书,但仅包含允许验证服务器证书的CA的证书。我看到的一个信任库示例是JRE中的一个示例(位于security文件夹中 - cacerts)。通过查看配置,我可以看到它受默认密码changeit的保护。我知道一个信任库是使用密钥库实现的,因此它有(或可能是可选的)使用密码进行加密。但是,由于信任库通常将公共信息(受信任的CA证书)存储在文件中,因此建议更改密码?

感谢

回答

2

提供密码的方法编程觉得奇怪, 我。

我不知道为什么这会很奇怪。应用程序需要能够在某个点或另一个位置获取密钥库的内容。不知何故,密码需要传递给它。将它传递给load()方法并不比其他解决方案更不合理(当然,避免硬编码)。或者,您也可以使用使用回调的方法。如果您认为不合适,可以使用PKCS#11提供程序和硬件令牌(尽管您仍然需要在某处输入密码/ PIN)或使用Apple KeychainStore之类的东西(密码不是使用,但操作系统钥匙串服务负责)。

关于信任库,实际上有两个密码在使用。使用JKS格式时,它们可以不同。一个保护密钥库本身,一个保护对私人条目的访问(getKey)。在这种情况下,密钥库密码用于防止未授权方更改信任库(并添加自己的CA或服务器证书)。

+0

谢谢,我没有想到对信任库的修改,这很明显。 – 2012-07-18 13:17:32

+0

我有另一个相关的问题。为什么在KeyManagerFactory执行时,TrustManagerFactory不需要密码进行初始化?此外,密钥库和信任库的密码都在load()期间提供。 – 2012-07-18 13:51:44

+0

KMF密码用于使用私钥。在这两种情况下,您都必须先将密钥库本身加载到工厂中。 – Bruno 2012-07-18 13:52:51