You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地通过KafkaJS经AWS SSM SSH隧道连接MSK Kafka遇主机名验证失败

解决MSK Kafka通过SSM隧道连接时的Hostname Verification Failed问题

问题根源

你通过SSM隧道将本地9098端口转发到AWS MSK Broker端口后,用localhost:9098连接Kafka时,SSL握手阶段会验证服务器证书的主机名是否匹配localhost。但MSK的SSL证书绑定的是自身Broker域名(比如xxxx.kafka.us-east-1.amazonaws.com),和localhost完全不匹配,因此触发「Hostname verification failed」错误。而在跳板机直接用真实Broker域名连接时,证书主机名匹配,验证自然通过。

解决方案

方案1:修改本地hosts映射(推荐,无安全风险)

将MSK Broker的真实域名映射到本地回环地址127.0.0.1,这样KafkaJS用真实Broker域名连接本地转发端口时,SSL主机名验证会匹配证书中的域名。

  1. 打开本地hosts文件:

    • Windows:C:\Windows\System32\drivers\etc\hosts
    • Linux/macOS:/etc/hosts
  2. 添加一行映射(替换为你的MSK Broker域名):

    127.0.0.1  your-msk-broker-xxxx.kafka.us-east-1.amazonaws.com
    
  3. 修改KafkaJS配置,用真实Broker域名加本地转发端口:

    ssl: {}, // 无需自定义验证逻辑,默认校验即可
    brokers: ['your-msk-broker-xxxx.kafka.us-east-1.amazonaws.com:9098']
    

方案2:自定义SSL主机名验证逻辑(仅测试环境使用)

如果无法修改hosts文件,可通过KafkaJS的checkServerIdentity函数跳过主机名验证,但生产环境严禁使用,会大幅降低SSL连接的安全性。

调整KafkaJS的SSL配置如下:

ssl: {
  checkServerIdentity: (servername, cert) => {
    // 返回undefined表示跳过主机名验证
    return undefined;
    // 可选:更严格的校验,仅允许指定的MSK Broker域名
    // const allowedDomain = 'your-msk-broker-xxxx.kafka.us-east-1.amazonaws.com';
    // if (cert.subject.CN === allowedDomain) return undefined;
    // throw new Error(`Invalid broker hostname: ${servername}`);
  }
},
brokers: ['localhost:9098']

内容的提问来源于stack exchange,提问作者thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:14:59