Java 中 trustStore 和 keyStore 的区别
如果你是 Java 开发人员并且使用过 Java SSL/TLS,你可能遇到过 trustStore 和 keyStore 这些术语。这两个文件用于存储加密密钥和证书。在 Java 8 之前,这些文件的默认格式是 JKS。随着 Java 9 的发布,默认格式更改为 PKCS12。其中,JKS 是 Java 特定的格式,而 PKCS12 是与语言无关的格式。本文将讨论 Java 中 trustStore 和 keyStore 之间的区别。
trustStore 与 keyStore
trustStore
它是一个文件,包含客户端信任的一组自签名证书。包含的证书来自受信任的证书颁发机构 (CA),这些机构为其他服务器颁发证书。trustStore 在 SSL 身份验证期间验证其他服务器的身份和真实性。首先,服务器从其 keyStore 中搜索关联的密钥,并将公钥和证书都显示给客户端。然后,客户端从 trustStore 中搜索关联的证书,以检查外部服务器提供的证书或证书颁发机构是否在我们的 trustStore 中。如果存在,则连接将成功建立,否则我们将收到 SSLHandshakeException。
要指定 trustStore 的类型和密码,我们需要设置以下属性
javax.net.ssl.trustStorePassword 和
javax.net.ssl.trustStoreType
keyStore
它是一个文件,包含私钥、密钥和证书,以及属于 keyStore 发送方或客户端的公钥。在 SSL 握手期间,客户端和服务器使用这些密钥和证书来验证消息和发送方的身份。首先,服务器查找私钥,然后将与其关联的公钥和证书显示给客户端。与此类似,客户端也通过显示公钥和证书来进行身份验证。整个过程称为双向身份验证。公钥执行加密,私钥执行数据的解密。
类和方法
java.security.KeyStore: 它是一个用于创建和操作密钥库的类。它提供了一些内置方法来加载、保存、添加、删除和枚举密钥库条目。
javax.net.ssl.keyStore: 用于指定 keyStore 的类型。
javax.net.ssl.keyStorePassword: 用于指定密码的类型。
setEntry(): 它是一个将条目添加到指定密钥库的方法。
aliases(): 此方法枚举密钥库中的所有条目,并返回一个字符串枚举,表示密钥库的所有别名。
到目前为止,我们已经了解了 trustStore 和 keyStore 的定义和工作原理。在下一节中,我们将讨论这两个存储之间的区别。
trustStore 和 keyStore 之间的区别
下表总结了根据以上讨论得出的 trustStore 和 keyStore 之间的区别
trustStore | keyStore |
---|---|
它包含我们可以信任的外部服务器的证书。 | 它包含我们应用程序的密钥和证书。 |
其中存储的密码对每个人都是可读的。 | 其中存储的密码仅对特定成员可读。 |
它在客户端建立连接时是必需的。 | 它在服务器端建立连接时是必需的。 |
trustStore 不保存任何私有和敏感数据。 | keyStore 保存客户端的私有和敏感数据。 |
它由 TrustManager 使用。 | 它由 KeyManager 使用。 |
结论
现在,我们已经讨论结束,让我们快速总结一下本文中讨论的内容。每当我们尝试与第三方应用程序通信时,都会使用 trustStore 和 keyStore 的概念。keyStore 充当安全存储设施,用于包含用于身份验证的加密密钥。trustStore 用于信任我们将与其通信的第三方。