MongoDB Kafka Connector(v1.15.0) TLS配置:Strimzi中绕过校验或挂载PEM
问题背景
我正尝试在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参数指定
- 将自签名证书转换为JKS格式的信任库:
keytool -importcert -file mongodb-cert.pem -alias mongodb-cert -keystore mongodb-truststore.jks -storepass your-password -noprompt
- 将信任库文件创建为Kubernetes Secret:
kubectl create secret generic mongodb-truststore --from-file=mongodb-truststore.jks
- 修改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

