MSK与Kafka组件TLS通信报错:InsecureSkipVerify设为false时连接失败
sarama连接MSK TLS端点验证失败问题排查与解决
问题现象
使用sarama库连接AWS MSK的TLS端点时,将InsecureSkipVerify设为true通信正常,但设为false时连接失败,抛出panic日志:
{"level":"panic","method":"main","msg":"kafka: client has run out of available brokers to talk to (Is your cluster reachable?)","package":"main","time":"2022-10-19T14:36:46Z"}
环境说明
MSK未绑定ACM,使用MSK原生TLS端点,相关配置代码如下:
type Config struct { ConsumerBrokers []string `envconfig:"consumer_brokers"` ProducerBrokers []string `envconfig:"producer_brokers"` ClientConfig *sarama.Config `envconfig:"client_config"` ConsumerTopic string `default:"Firehose" envconfig:"consumer_topic"` ConsumerGroup string `default:"router" envconfig:"consumer_group"` ProducerPrefix string `default:"" envconfig:"producer_prefix"` LogLevel string `default:"info" envconfig:"log_level"` HttpAddr string `default:":8080" envconfig:"http_addr"` } var conf Config conf.ClientConfig = sarama.NewConfig() tlsConfig := tls.Config{} conf.ClientConfig.Net.TLS.Enable = true conf.ClientConfig.Net.TLS.Config = &tlsConfig conf.ClientConfig.Net.TLS.Config.InsecureSkipVerify = false
解决方案
1. 加载MSK根证书
MSK的TLS端点使用AWS官方根CA证书,默认空的tls.Config未包含该证书,导致验证失败。需手动加载根CA到证书池:
import ( "crypto/x509" "io/ioutil" ) // 替换为你本地的AWS根CA证书路径(可从AWS官方获取) caCert, err := ioutil.ReadFile("/path/to/aws-root-ca.pem") if err != nil { panic(err) } certPool := x509.NewCertPool() if !certPool.AppendCertsFromPEM(caCert) { panic("添加根CA证书失败") } tlsConfig := tls.Config{ RootCAs: certPool, } conf.ClientConfig.Net.TLS.Config = &tlsConfig conf.ClientConfig.Net.TLS.Config.InsecureSkipVerify = false
2. 确认Broker地址与证书SAN匹配
必须使用MSK TLS端点的完整域名(如b-1.xxx.xxx.kafka.us-west-2.amazonaws.com:9094)作为Broker地址,不能用IP地址。证书中的Subject Alternative Names(SAN)只包含域名,IP访问会触发验证失败。
3. 检查网络与安全组配置
确保客户端所在网络能解析MSK域名,且MSK安全组允许客户端访问9094端口(TLS端口)。
内容的提问来源于stack exchange,提问作者MBA
相关产品推荐
相关产品推荐

