背景
- 我需要为各种客户端连接到服务器。
- 每个客户端连接都应使用唯一的 TLS 证书。
- MTLS 在服务器上就位。
- 我想使用连接池来改善延迟。
使用以下 http 客户端
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
我的假设 在管理连接池中的连接时,在选择连接时,应在选择连接池中的相同连接之前考虑客户端证书。我不希望使用 clientB TLS 证书与 clientA 建立连接,反之亦然。
问题 这个假设是真的吗?
场景 1)
我将每个路由的最大连接数设置为 2。我为客户端 A 调用 MTLS 安全服务器。(池中的一个连接)我为客户端 A 调用 MTLS 安全服务器。(池中的两个连接)这不应该重用第一个连接吗?
方案 2)
我将每个路由的最大连接数设置为 2。我为客户端 A 调用 MTLS 安全服务器。(池中的一个连接)我为客户端 B 调用 MTLS 安全服务器。(池中的两个连接)
但是,第二次调用似乎没有进行完整的握手,而是使用了 clientA 证书。
我希望第二次通话需要完整的握手,并且无论如何连接都不会相关。
这是预期的行为吗?我在这里遗漏了一些明显的东西吗?
更新了更简单的测试用例
我们现在使用的是 http 上下文,所以我附上了更新的日志。我也简化了测试用例,现在它每次应该使用不同的客户端证书时连接到同一个服务器两次。
该应用程序正在使用 spring boot,并且有一个 restTemplate 和一个 httpClient。
它使用 PrivateKeyStrategy 来决定在与服务器通信时使用什么私钥/证书。
第一个连接使用密钥别名“e2e_transport_key_id_franek”(您将在日志中看到这一点)
第二个连接应该使用别名'e2e_transport_key_id_pdw'(在日志中从未见过)
我们正在建立的第二个连接应该使用别名为“e2e_transport_key_id_pdw”的密钥/证书,但是会话已恢复,请参见第 448 行尝试恢复会话。这意味着我们不能使用 PrivateKeyStrategy 来选择要使用的客户端证书。
如何强制客户端连接不为我们打算使用不同客户端证书的连接重用会话?