首页 > 解决方案 > 客户端收到CertificateRequest消息后如何选择证书

问题描述

我有一个 java 项目,其中包含 3 个独立的 SpringBoot REST 服务(3 个不同的 tomcat 实例),它们通过SSL/TLS使用2-way authentication 进行通信。每个都有自己配置的密钥库和信任库,并且服务完美地发送/接收请求。

我的问题是:“如何选择所需的证书来响应 CertificateRequest 消息?”。具体来说,如果密钥库有多个具有相同权限的证书(即 CN、OU、O、L、ST、C)。我知道证书是根据“CertificateRequest 握手消息”中发送的属性选择的,但是如果密钥库中的两个或多个证书符合标准怎么办(尽管这些证书不一样,它们只是符合 CertificateRequest)?

更具体地说,假设我们已经创建了一个带有单个证书的密钥库,该证书将用于启动应用程序,我们还添加了另一个证书,我们称之为key1,使用以下命令:

keytool -genkeypair -alias key1 -keyalg RSA -keysize 4096 -storetype JKS -keystore keystore.jks -validity 3650 -storepass 123456

并指定当局:

CN=cert1, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown

然后我们导出此证书并将其放入另一个应用程序的信任库中。假设我们已经信任“另一个”应用程序,所以我们的应用程序现在通过 2-way SSL/TLS 成功通信。

现在,如果我们为第一个应用程序重复证书生成步骤,但只指定另一个别名key2,那么它不会覆盖key1

keytool -genkeypair -alias key2 -keyalg RSA -keysize 4096 -storetype JKS -keystore keystore.jks -validity 3650 -storepass 123456

我们还指定与key1完全相同的权限:

CN=cert1, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown

现在,在 application1 的密钥库中,我们有两个不同的证书key1key2,它们具有相同的权限签名算法

如果我们现在测试我们的应用程序,它们将工作得非常好(至少在我的情况下是这样)。SSL 握手成功完成。

那么问题来了,为什么选择了正确的证书,即使至少有两个 (我们可以添加更多,结果不会改变) 适合证书请求消息中指定的条件?

几天来我一直在寻找这个问题的答案,但似乎在任何地方都找不到。

提前致谢!

标签: sslcertificatessl-certificatetls1.2client-certificates

解决方案


推荐阅读