.jks 密钥库的用途是什么?

What is the purpose of a .jks keystore?

我被要求根据我们创建的证书创建一个 jks 密钥库。我已经阅读了一些关于该主题的内容,但我仍然对一些项目感到困惑:

证书的私钥应该存储在 .jks keystone 中吗?

如果是 - 这是在哪里输入的?使用密钥工具,创建 jks 文件不需要密钥工具。

如果不是 - jks 文件的用途是什么?为什么我的应用程序需要它而不是直接读取证书?如果 keytool 仅包含 public 密钥,为什么它需要密码才能创建 jks?

Is the private key of a certificate supposed to be stored in a .jks keystone?

是的,如果您拥有该证书并且它存储在那里。

If yes - where does this get entered in? Using the keytool, it doesn't require one for creating a jks file.

那是因为您还可以将其用作信任库,它只包含受信任的证书。

要在其中获取私钥,您需要先使用 openssl 将其及其证书转换为 PKCS#12 文件,如 this 等众多问题中所回答的那样。

If no - what is the purpose of a jks file? Why would my application need it instead of just reading in a certificate directly?

因为你的应用还需要证书的私钥。

And why does the keytool require a password to create a jks if it just contains a public key?

密钥库有密码,因为它是与安全相关的实体。

密钥存储的目的是使用基于密码的算法保护加密密钥的隐私和完整性。隐私意味着密钥是保密的;它们只能由知道密码的人使用;这对于私钥和秘密密钥很有用。完整性意味着知道密码的人可以检测到密钥的更改;这对 public 密钥和秘密密钥很有用。

是否应包括私钥取决于您要做什么。例如,如果您正在为您的服务器创建一个密钥库以便它可以向客户端验证自己,那么它应该包含私钥。如果您创建了一个自签名证书,并希望为客户提供一个密钥库以便他们可以验证您的服务,那么它应该包含私钥。

如果您有一个预先存在的密钥对,并希望将其导入 JKS 格式的密钥库,最简单的方法可能是 use OpenSSL to create a PKCS #12 format key store, then use keytool to convert that to a JKS key store. 通常,keytool 期望执行密钥对生成本身,因此私钥将从一开始就存储在那里。

您应该先验证 public 密钥或证书的完整性,然后再使用它来加密消息或验证签名。否则,攻击者可以用他拥有的密钥替换密钥并充当中间人。如果您只是从文件中读取 public 密钥,您并不知道它确实属于您的预期接收者。但是,如果您使用 public 密钥存储基于密码的消息验证码,则可以确保它未被篡改。