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

为Percona MongoDB分片集群配置TLS时遇错误求助

解决Percona MongoDB分片集群TLS认证私钥与公钥不匹配问题

问题背景

配置Percona MongoDB分片集群TLS认证时,创建了包含base64编码的ca.crt、tls.crt和tls.key的Secret:

data:
ca.crt: XXXXXX
tls.crt: XXXXXX
tls.key: XXXXXX
kind: Secret
name: my-testdb-psmdb-mongo
namespace: percona-operator
type: kubernetes.io/tls

并在cluster.yaml中配置:

secrets:
ssl: my-testdb-psmdb-mongo
sslInternal: my-testdb-psmdb-mongo

出现错误:

QUERY [js] uncaught exception: TypeError: db.isMaster(…).$configServerState is undefined 
(shell eval):1:1 [main] exiting with code -4 exit_status=0
Exit: connect to PBM: create mongo connection: create mongo client: tls: private key does not match public key

解决方案

1. 验证证书与私钥的匹配性

这是报错的核心原因,执行以下命令确认两者是否配对:

  • 从证书中提取公钥:
    openssl x509 -in tls.crt -pubkey -noout > cert_pub.key
    
  • 从私钥中提取公钥:
    openssl rsa -in tls.key -pubout > key_pub.key
    
  • 对比两个公钥文件:
    diff cert_pub.key key_pub.key
    
    如果输出有差异,说明证书和私钥不匹配,需要重新生成配对的证书和私钥(确保生成时使用同一套密钥对)。

2. 检查base64编码的正确性

确保证书/密钥文件是纯PEM格式(无多余换行、空格),再用正确的方式编码:

  • Linux环境编码(无换行):
    base64 -w 0 tls.crt > tls.crt.base64
    base64 -w 0 tls.key > tls.key.base64
    base64 -w 0 ca.crt > ca.crt.base64
    
  • macOS环境编码(无换行):
    base64 tls.crt > tls.crt.base64
    base64 tls.key > tls.key.base64
    base64 ca.crt > ca.crt.base64
    
  • 反向解码验证:将Secret中的值解码后和原始文件对比,确认无损坏:
    echo "XXX" | base64 -d > decoded.crt
    diff decoded.crt tls.crt
    

3. 确认证书包含双向认证扩展

MongoDB分片集群节点同时作为服务端和客户端,需要证书支持双向认证:

  • 查看证书扩展信息:
    openssl x509 -in tls.crt -text -noout
    
  • 确保X509v3 Extended Key Usage字段包含serverAuth和clientAuth:
    X509v3 Extended Key Usage: 
        TLS Web Server Authentication, TLS Web Client Authentication
    
    如果缺失,需要重新生成证书时添加该扩展(在openssl配置文件中设置extendedKeyUsage = serverAuth, clientAuth)。

4. 重新创建Secret并更新集群配置

确认上述步骤无误后,删除旧Secret并重新创建:

kubectl delete secret my-testdb-psmdb-mongo -n percona-operator
kubectl create secret tls my-testdb-psmdb-mongo -n percona-operator --cert=tls.crt --key=tls.key --from-file=ca.crt=ca.crt

然后重新应用集群配置:

kubectl apply -f cluster.yaml -n percona-operator

内容的提问来源于stack exchange,提问作者Karthiknathan.C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:35:12