求助:如何使用Golang通过SSL连接Kafka集群?
Golang连接SSL认证Kafka Topic的问题解决
问题概述
我正尝试连接一个需要SSL认证的Kafka Topic,手头有集群管理员提供的ca.crt、ca.p12文件及对应密码,用基于keytool/keystore的测试工具能正常连接,但Golang代码里死活连不上。
当前可用的SASL连接代码与配置
我的Golang生产者初始化代码如下:
func (p *KafkaPublisher) Initialise() { configFile := "./config/kafka.properties" fmt.Printf("Reading config file from: %s\n", configFile) conf := ReadConfig(configFile) var err error kafkaProducer, err = kafka.NewProducer(&conf) // 其余代码已注释 }
用下面的SASL配置文件时,这段代码能正常工作:
bootstrap.servers=markets-cb--vog--pu-taejvaba.bf2.kafka.rhcloud.com:443 security.protocol=SASL_SSL sasl.mechanisms=PLAIN # 服务账户用户名 sasl.username=700e9c83-b4be-4f23-8697-b6cfa5921354 sasl.password=ab955a0d-e78d-4d96-bd8e-35de3b6b83e5 # Kafka生产者防止数据丢失的最佳实践 acks=all
SSL配置尝试中的问题
我试了用SSL配置连接,但一直失败,配置文件如下:
bootstrap.servers=my-cluster-kafka-listener1-bootstrap-climate.violet-cluster-new-2761a99850dd8c23002367ac6ce7f9ad-0000.au-syd.containers.appdomain.cloud:443 security.protocol=SSL ssl.key.password=ebuSuzkDbfFK ssl.certificate.location="ca.pem" # Kafka生产者防止数据丢失的最佳实践 acks=all
后来我尝试把PEM证书内容用单引号内联到ssl.certificate.pem参数里,得到了这个错误:
Failed to create producer: ssl.certificate.pem failed: not in PEM format?: error:0909006C:PEM routines:get_name:no start line: Expecting: CERTIF
但这个证书确实是标准PEM格式,内容如下(已脱敏):
-----BEGIN CERTIFICATE----- MIIFLTCCAxWgAwIBAgIUBT4au51IElFmVL4RenvrRsFpwiwwDQYJKoZIhvcNAQEN BQAwLTETMBEGA1UECgwKaW8uc3RyaW16aTEWMBQGA1UEAwwNY2x1c3Rlci1jYSB2 MDAeFw0yMjA3MTkwNTE4NDBaFw0yMzA3MTkwNTE4NDBaMC0xEzARBgNVBAoMCmlv LnN0cmltemkxFjAUBgNVBAMMDWNsdXN0ZXItY2EgdjAwggIiMA0GCSqGSIb3DQEB AQUAA4ICDwAwggIKAoICAQDdghbY97oYE5A1GcGccMMp01RW3DSsl3tZ3U/Q2YKY IDkqwkITevXu0WjUHh7v/659xwryNMtUjlz8JF4MZQnZwq1xEX6ldA+/+JeG2pJE eEnFXPvP9meDfi2N5bQC/At5N5ZAca4jfrKVognzgHMj1JMwXtTLu4Jw73Za+dRg y30I51x33zPTYgq+5QKTssOvvAQp+OGsf2ts1s3P5weOLJ3tfGUrVdhoblMB+RUl TF7KIuknFY0+sNRUJSeuw29qUdH9KFJ3bYBMEF2afSybS4DlFSrs7Od0ZsPWnONn ZRV/SdjpvjP13k32XqzX8O1h0oOnHOPExE7OQgjRVcluJh3aJbSEAb9DnAUCRX88 /ZA2tlDWGxJIv94CruKDaF6vMaupUUXmQG0Irk8cfGKHgwjvG2HL2U/oaJpPEtdo Zu2TgeHxF/k9YBfzKC6ZlZrwQLN1iL+mAL45ql1OYyGVWPS6NWUSpJA9FS7qJlfr o7hiD/wg4xubtGntBCui+jdrRoDwcVQvk5+pZYNchK26oT4qjY57YhXLWByesg+c MUSDTgtU//DHfAq6VyJqMbnP68RwW1MRMg1lbiMUTJ8wTsKgBm6fZ1E2+Jg/wJtq FhLTBjiB6Fa2m6aZQdqaN/RMu9mUNjE45b4GVIFayouS1ejGoNNsC2rv0n4CQhNj +wIDAQABo0UwQzAdBgNVHQ4EFgQU2YAwObuT5NpEivgwO+j+Z/qSn1gwEgYDVR0T AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIB AB+18g/YjUYpLbBrQgzvHhNP0THKUzVQ5ze15JZfaQHdOf6XYhAMpnHm/mBrXM2B 5ZHwkQzCuHfZmSikeVnr/thloh1+2NHdf9s4XQtxZiouZxzNnbX3Hf/gviX/lvm2 p8twSqxsMnI00x7jPDGDmZBF5bX7Mtp3c7gD3K4goz8InHdn8j1jxhYg0fQdX8j3 ryoy+hWCkaW1PPYxGgrmdJg7kiffTBw3jx9+Md11EXb7+ryZeUEsI6MqGQSg6F94 U+nPWV/qBErEbe5iNISdOkUK8wcjk/IOVAps1CJs8BECcCaReGwVpC8twxx9c8BY DEW76Y8J9syxgxUZeEywoqguxc80SSuTLXcNkAoifdReUeW/b08cJffP55nztfbE Fhg4E5vYj41q2Z5iOI1sZsY22Z4VszW0Fl11DcloM4/088W6O3Lp3Jo0rMu/k14/ DNr5AM8Lrgno947S1OWZ87Q1IF8zlayM+c5XWRHO64jBHouTo1HvDodudaF+XYxv F7xRVUehnnACQExy2OYeOkjtxmsinQDfZcvvj7b7NfCqytM3IjB1jk9GxeoFgKYj /n9WFjHWtSnC+nsyZo2c37XeaHbBEtls3LHXb6+OmOtiTzw0C8TEQJ4AcqaPNk1k knHg6PPWBenWskC9KH898c6vvhZ5/VHSWXJG6f8GxWya -----END CERTIFICATE-----
可行的解决方案
方案1:直接使用PKCS12文件配置
既然已经有ca.p12文件,可以直接用它来配置,不用转换格式。修改kafka.properties如下:
bootstrap.servers=你的集群地址:443 security.protocol=SSL # 指定P12密钥库路径 ssl.keystore.location=./ca.p12 # P12文件的密码 ssl.keystore.password=ebuSuzkDbfFK # 如果P12里包含CA根证书,直接用它作为信任库 ssl.truststore.location=./ca.p12 ssl.truststore.password=ebuSuzkDbfFK acks=all
方案2:将P12转换为PEM文件使用
如果一定要用PEM格式,可以用openssl工具把P12文件拆分成证书、私钥和CA证书:
# 导出客户端私钥(会要求输入P12密码) openssl pkcs12 -in ca.p12 -nocerts -out client.key -nodes # 导出客户端证书 openssl pkcs12 -in ca.p12 -clcerts -nokeys -out client.crt # 导出CA根证书 openssl pkcs12 -in ca.p12 -cacerts -nokeys -out ca.crt
然后配置文件改成:
bootstrap.servers=你的集群地址:443 security.protocol=SSL ssl.certificate.location=./client.crt ssl.key.location=./client.key ssl.key.password=ebuSuzkDbfFK # 指定CA根证书路径 ssl.ca.location=./ca.crt acks=all
关键注意事项
- 配置文件里的路径不要加引号!之前的
ssl.certificate.location="ca.pem"是错误的,应该写成ssl.certificate.location=ca.pem,这也是之前报错的主要原因。 - 确保证书文件的路径是相对于程序运行的工作目录,或者用绝对路径。
- 检查你的Golang Kafka客户端(底层是librdkafka)版本,确保支持这些SSL配置参数。
内容的提问来源于stack exchange,提问作者Bryon
相关产品推荐
相关产品推荐

