【问题标题】:Keystore's password managementKeystore 的密码管理
【发布时间】:2012-07-17 11:20:03
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: java security ssl jsse


    【解决方案1】:

    以编程方式为方法提供密码似乎很奇怪 我。

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

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

    【讨论】:

    • 谢谢,我没想过要修改信任库,很明显。
    • 我还有一个相关的问题。为什么 TrustManagerFactory 不需要密码来初始化,而 KeyManagerFactory 需要?此外,Keystore 和 Truststore 的密码都已在 load() 期间提供。
    • KMF 密码用于使用私钥。在这两种情况下,在将密钥库传递给任一工厂之前,您都已经加载了密钥库本身。
    最近更新 更多