Data Prepper对接Kafka数据源:KeyTab认证配置及SSL错误求助
问题
我们尝试以Kafka为数据源、OpenSearch为输出端(Sink)使用Data Prepper,但目标Kafka集群仅支持KeyTab认证。根据Data Prepper文档,其Kafka的SASL认证仅支持用户名密码方式,而我们仅有KeyTab与krb5.conf文件。
我们已通过Docker运行命令的JAVA_OPTS传递KeyTab、krb5.conf、jaas.conf及JKS文件,且文件已正确挂载至容器,但仍遇到SSL握手失败错误:
Authentication error while doing poll(). Will retry after 10 seconds 2024-07-18 10:17:12 org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed 2024-07-18 10:17:12 Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
当前使用的Docker运行命令:
docker run -e JAVA_OPTS="-Djava.security.auth.login.config=/usr/share/data-prepper/jaas.conf -Djava.security.krb5.conf=/usr/share/data-prepper/krb5.conf -Djava.ssl.truststore=/usr/share/data-prepper/Services.jks -Djava.ssl.truststoreType=jks -Djava.ssl.keystore=/usr/share/data-prepper/Services.jks -Djava.ssl.keyStoreType=jks -Djava.ssl.keyStorePassword=passwordtemplate -Djava.ssl.trustStorePassword=passwordtemplate" \ --name data-prepper \ -v /OpenSearch/krb5.conf:/usr/share/data-prepper/krb5.conf \ -v //OpenSearch/TestPipeline-Kafka.yml:/usr/share/data-prepper/pipelines/pipelines.yml \ -v /OpenSearch/CORPDEV_svc_vd_streams.keytab:/usr/share/data-prepper/CORPDEV_svc_vd_streams.keytab \ -v /OpenSearch/jaas.conf:/usr/share/data-prepper/jaas.conf \ -v /OpenSearch:/usr/share/data-prepper/Services.jks \ opensearchproject/data-prepper:latest
当前使用的Pipeline配置:
prepper-pipeline: source: kafka: bootstrap_servers: - sl73kfkdbq001.testinternal.com:9093 - sl73kfkdbq002.testinternal.com:9093 - sl73kfkdbq003.testinternal.com:9093 topics: - name: topic_name group_id: data-prepper-1 authentication: sasl: processor: - parse_json: - delete_entries: with_keys: ["message"] sink: - opensearch: hosts: ["https://opensearch-np.testinternal.com:9243"] username: username password: password index: vd-payouts-transactions-${/version}-${/transactionType}-{/timestamp} document_id: ${/transactionId} insecure: false max_retries: 2
请问如何通过KeyTab完成Kafka认证,且当前缺失哪些证书导致SSL握手失败?
解决方案
1. 通过KeyTab实现Kafka SASL认证
可以通过JVM层面的JAAS配置绕过Data Prepper文档标注的限制,具体配置步骤:
- 完善JAAS配置文件:确保
jaas.conf包含Kafka客户端的Kerberos认证规则,示例内容:
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/usr/share/data-prepper/CORPDEV_svc_vd_streams.keytab" principal="svc_vd_streams@TESTINTERNAL.COM" useTicketCache=false; };
注意替换principal为你的服务主体名,KeyTab路径要和容器内挂载路径一致。
- 修正Pipeline的SASL配置:在Kafka source的
sasl节点补充认证机制和协议:
authentication: sasl: mechanism: GSSAPI protocol: SASL_SSL
GSSAPI是Kerberos对应的SASL认证机制,SASL_SSL表示同时启用SASL认证和SSL加密。
- 修复Docker挂载错误:当前命令中
-v /OpenSearch:/usr/share/data-prepper/Services.jks是将目录挂载为文件,会导致JKS文件无法读取,修改为:
-v /OpenSearch/Services.jks:/usr/share/data-prepper/Services.jks
2. SSL握手失败的原因及修复
当前错误PKIX path building failed说明JVM信任库中缺少Kafka集群的SSL证书,具体问题和修复:
- 缺失的证书:Kafka Broker的SSL证书(或其签发CA的根/中间证书)未导入到
Services.jks信任库中。 - 修复步骤:
- 导出Kafka Broker的SSL证书:
openssl s_client -connect sl73kfkdbq001.testinternal.com:9093 < /dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > kafka-broker.crt - 将证书导入到JKS信任库:
keytool -importcert -file kafka-broker.crt -keystore Services.jks -alias kafka-broker-001 -storepass passwordtemplate - 确保更新后的
Services.jks正确挂载到容器,且JVM参数中的信任库密码匹配。
- 导出Kafka Broker的SSL证书:
内容的提问来源于stack exchange,提问作者Pronoy999
相关产品推荐
相关产品推荐

