本地通过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主机名验证会匹配证书中的域名。
打开本地hosts文件:
- Windows:
C:\Windows\System32\drivers\etc\hosts - Linux/macOS:
/etc/hosts
- Windows:
添加一行映射(替换为你的MSK Broker域名):
127.0.0.1 your-msk-broker-xxxx.kafka.us-east-1.amazonaws.com修改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
相关产品推荐
相关产品推荐

