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

求助:如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:15:38