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

MongoDB Kafka Connector(v1.15.0) TLS配置:Strimzi中绕过校验或挂载PEM

在Strimzi KafkaConnect中部署MongoDB Kafka Source Connector的SSL连接问题解决

问题背景

我正尝试在Kubernetes上通过Strimzi KafkaConnect(v1beta2)部署MongoDB Kafka Source Connector(v1.15.0)以连接MongoDB,相关上下文如下:

  • MongoDB URI:mongodb://user:pass@mongo-host:27017/?authSource=mydb&tls=true&tlsAllowInvalidCertificates=true
  • KafkaConnect版本:3.8.1
  • Mongo Kafka Connect插件:mongo-kafka-connect-1.15.0-all.jar
  • 内部使用的MongoDB Java驱动:4.7.2

遇到的问题:传入tlsAllowInvalidCertificates=true和tlsAllowInvalidHostnames=true后,连接器连接失败,抛出SSL握手错误,同时日志提示Connection string contains unsupported option 'tlsAllowInvalidCertificates'。


疑问解答

1. 4.7.2版本驱动下绕过证书校验的正确方式

MongoDB Java驱动4.7.2版本不支持tls前缀的证书跳过参数,需使用旧版ssl前缀的参数:

  • 将URI中的tlsAllowInvalidCertificates=true替换为sslAllowInvalidCertificates=true
  • 将tlsAllowInvalidHostnames=true替换为sslInvalidHostNameAllowed=true

修改后的完整URI示例:

mongodb://user:pass@mongo-host:27017/?authSource=mydb&tls=true&sslAllowInvalidCertificates=true&sslInvalidHostNameAllowed=true

注:4.7.2版本中tls=true参数是兼容的,无需替换为ssl=true。

2. 通过自定义JDK信任库信任自签名PEM证书

完全可行,有两种实现方式:

方式一:构建自定义Kafka Connect镜像并导入证书到JDK信任库

基于Strimzi官方Kafka Connect镜像(如strimzi/kafka:0.39.0-kafka-3.8.1)构建镜像,将PEM证书导入JDK默认的cacerts信任库:

FROM strimzi/kafka:0.39.0-kafka-3.8.1
COPY mongodb-cert.pem /tmp/
RUN keytool -importcert -file /tmp/mongodb-cert.pem -alias mongodb-cert -keystore /opt/java/openjdk/lib/security/cacerts -storepass changeit -noprompt

然后在KafkaConnect CR中指定这个自定义镜像。

方式二:挂载自定义信任库并通过JVM参数指定

  1. 将自签名证书转换为JKS格式的信任库:
keytool -importcert -file mongodb-cert.pem -alias mongodb-cert -keystore mongodb-truststore.jks -storepass your-password -noprompt
  1. 将信任库文件创建为Kubernetes Secret:
kubectl create secret generic mongodb-truststore --from-file=mongodb-truststore.jks
  1. 修改KafkaConnect CR,通过template字段挂载Secret并设置JVM参数:
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: your-connect-cluster
spec:
  image: strimzi/kafka:0.39.0-kafka-3.8.1
  template:
    pod:
      spec:
        volumes:
          - name: truststore-volume
            secret:
              secretName: mongodb-truststore
        containers:
          - name: kafka-connect
            volumeMounts:
              - name: truststore-volume
                mountPath: /opt/kafka/truststore
            env:
              - name: KAFKA_OPTS
                value: "-Djavax.net.ssl.trustStore=/opt/kafka/truststore/mongodb-truststore.jks -Djavax.net.ssl.trustStorePassword=your-password"

3. 升级Mongo驱动至4.10+版本的可行性及操作步骤

完全可行,4.10+版本支持tlsInsecure=true参数(可同时跳过证书和主机名校验),操作步骤如下:

步骤1:选择兼容的Mongo Kafka Connector版本

Mongo Kafka Connector 1.18.0及以上版本内置MongoDB Java驱动4.10+(如1.18.0对应驱动4.10.2),下载对应版本的mongo-kafka-connect-<version>-all.jar。

步骤2:构建自定义Strimzi Kafka Connect镜像

基于官方镜像构建,替换或添加新版插件:

FROM strimzi/kafka:0.39.0-kafka-3.8.1
# 删除旧版Mongo插件(如果已存在)
RUN rm -rf /opt/kafka/plugins/mongo
# 创建插件目录并复制新版jar
RUN mkdir -p /opt/kafka/plugins/mongo
COPY mongo-kafka-connect-1.18.0-all.jar /opt/kafka/plugins/mongo/

步骤3:更新KafkaConnect CR使用自定义镜像

修改KafkaConnect CR的spec.image字段为你的自定义镜像地址,重启后Kafka Connect会加载新版插件。

步骤4:更新MongoDB URI参数

使用tlsInsecure=true替代原有的两个跳过参数,示例URI:

mongodb://user:pass@mongo-host:27017/?authSource=mydb&tls=true&tlsInsecure=true

补充说明

  • 之前尝试挂载证书到插件路径无效,是因为JVM默认不会从插件目录读取SSL证书,必须导入到信任库或通过JVM参数指定信任库路径。
  • 删除KafkaConnector CR后旧配置未失效,需通过Kafka Connect REST API删除连接器配置:
curl -X DELETE http://<connect-service>:8083/connectors/<connector-name>

内容的提问来源于stack exchange,提问作者chatgpt premium

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:29:51