为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:
如果缺失,需要重新生成证书时添加该扩展(在openssl配置文件中设置X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client AuthenticationextendedKeyUsage = 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
相关产品推荐
相关产品推荐

