Quarkus 2.x迁移Kafka SSL握手失败,如何覆盖端点验证算法?
Quarkus 2.x 解决Kafka SSL端点识别算法配置被忽略的问题
问题原因
Quarkus 2.x升级后,内置的SmallRye Kafka客户端配置逻辑发生变化:直接在通道配置中设置ssl.endpoint.identification.algorithm=空值会被框架默认值覆盖,导致主机名验证强制启用;同时默认SSL协议切换为TLSv1.3,这两个变化共同引发了SSL握手时的证书DNS匹配错误。
解决方案
1. 全局Kafka客户端配置覆盖
在application.properties中添加全局配置,对所有Kafka客户端生效:
# 全局禁用SSL端点主机名验证 quarkus.kafka.clients.ssl.endpoint.identification.algorithm= # 全局强制使用TLSv1.2,与Quarkus 1.x保持一致 quarkus.kafka.clients.ssl.protocol=TLSv1.2
2. 单个通道针对性配置
如果只需对特定的消息通道生效,在原有通道配置基础上补充以下参数:
mp.messaging.incoming.ddd.ssl.endpoint.identification.algorithm= mp.messaging.incoming.ddd.ssl.protocol=TLSv1.2
注:部分Quarkus 2.x版本中,通道级的ssl.endpoint.identification.algorithm配置可能仍被全局默认值覆盖,此时优先使用全局配置方案。
3. 自定义客户端配置类(兜底方案)
如果以上配置均不生效,通过自定义KafkaClientCustomizer手动修改客户端配置:
import io.quarkus.kafka.client.runtime.KafkaClientCustomizer; import javax.enterprise.context.ApplicationScoped; import java.util.Map; import org.apache.kafka.common.config.SslConfigs; @ApplicationScoped public class KafkaSslConfigCustomizer implements KafkaClientCustomizer { @Override public void customize(Map<String, Object> configs) { // 强制设置端点识别算法为空,跳过主机名验证 configs.put(SslConfigs.SSL_ENDPOINT_IDENTIFICATION_ALGORITHM_CONFIG, ""); // 强制指定SSL协议为TLSv1.2 configs.put(SslConfigs.SSL_PROTOCOL_CONFIG, "TLSv1.2"); } }
该类会在Kafka客户端初始化阶段介入,直接修改底层配置参数,确保设置生效。
验证步骤
- 启动应用后,查看调试日志,确认
ssl.endpoint.identification.algorithm为空,ssl.protocol为TLSv1.2 - 测试Kafka消息消费/生产,确认SSL握手成功,不再抛出
CertificateException: No subject alternative DNS name matching xxx found错误
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

