SASL_SSL 安全协议如何工作?客户端是否验证服务器(X.509 证书)?

时间:2021-06-13 01:28:41

标签: java ssl sasl

SSL 的工作原理众所周知,因为它在任何地方都得到了广泛的使用和描述。简而言之 - SSL 涉及

  1. 客户端通过验证服务器 X.509 证书来验证服务器的真实性。
  2. 然后使用 diffie-hellman 密钥交换算法获得对称密钥。

但我不确定/** * Await the result of all the Calls in parallel. Any exception thrown by any item * in the list will cancel all unfinished calls and be rethrown. */ suspend fun <T: Any> Iterable<Call<T>>.awaitAll(): List<T> = coroutineScope { map { async { it.await } }.awaitAll() } //... lifecycleScope.launch { val requests: List<Call<UploadedRead>> = listOf( //... ) val responses: List<UploadedRead> = try { requests.awaitAll() } catch (e: HttpException) { //... return@launch } //... } 会发生什么。 Kafka 等少数技术的客户端和服务器通信依赖此安全协议作为选项之一。在这里,我担心上面的第 1 点。如果我从某人那里得到错误的经纪人地址(作为一种技巧),SASL_SSL 是否验证服务器证书是我的问题。如果是这样,那么我可以确定接收到的代理不是真实的,我的应用程序不会发布或订阅来自该服务器的消息,我的数据是安全的。

编辑 1:遵循@steffen-ullrich 的回答和评论 还有更多的挖掘,我在下面看到。看起来证书验证在通过 chrome 使用时正在发生,并且可能也在 security.protocol=SASL_SSL 中加载。所以java代码能够验证服务器..看起来没问题..

编辑 2:对,证书 DST 和 ISRG 预加载在 JDK 11 cacerts 中,因此客户端能够按照 Stephen 的评论对服务器进行身份验证。 enter image description here

2 个答案:

答案 0 :(得分:1)

您所问的与其他配置有关,请阅读以下说明。

ssl.endpoint.identification.algorithm 客户端用于验证服务器主机名的端点识别算法。默认值为 https。包括由代理创建的用于代理间通信的客户端连接的客户端验证代理主机名是否与代理证书中的主机名匹配。通过将 ssl.endpoint.identification.algorithm 设置为空字符串来禁用服务器主机名验证。 类型:字符串 默认值:https 重要性:中等

答案 1 :(得分:1)

SASL 是客户端身份验证的标准 - 参见 Simple Authentication and Security Layer。 SASL_SSL 仅表示通过受保护的连接 (SSL) 使用客户端身份验证 (SASL) 来防止拦截,而不是通过普通连接。