ssl - 客户端收到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 的密钥库中,我们有两个不同的证书key1和key2,它们具有相同的权限和签名算法
如果我们现在测试我们的应用程序,它们将工作得非常好(至少在我的情况下是这样)。SSL 握手成功完成。
那么问题来了,为什么选择了正确的证书,即使至少有两个 (我们可以添加更多,结果不会改变) 适合证书请求消息中指定的条件?
几天来我一直在寻找这个问题的答案,但似乎在任何地方都找不到。
提前致谢!
解决方案
推荐阅读
- html - 如何使表格边框适用于所有浏览器?
- javascript - JavaScript:在调用该 EventListener 的函数中删除 EventListener
- c# - 编写测试用例时,有没有办法从 ini 文件加载数据?
- android - 需要帮助在 Kotlin 的 Firebase QR 码扫描仪中完成活动
- vb.net - 您如何区分运算符与知道它不是运算符但属于字符串?
- ios - 如何在所有视图控制器的导航栏中添加一个通用按钮?
- laravel - Laravel - 如何解决错误 404 路由问题
- mysql - 在 MySQL 5.7 中混合事务和表锁是不现实的吗?
- css - 保持光标在列表之间抓取。@angluar/cdk/拖放
- java - 如何防止 JSONArray[0] is not a JSONObject 错误?