使用minikube配置MongoDB 4.2 TLS时证书读取错误排查
问题描述
在minikube中配置MongoDB 4.2 TLS加密时,使用以下启动参数:--auth --tlsMode requireTLS --tlsCertificateKeyFile /etc/ssl/mongodb-test-ca.crt --tlsCAFile /etc/ssl/test-ca.pem --oplogSize 32 --quiet --replSet myreplicaset --logpath /dev/stdout
运行时触发错误:cannot read certificate file: /etc/ssl/mongodb-test-ca.key error:0909006C:PEM routines:get_name:no start line
证书生成命令参考官方文档执行:
openssl genrsa -out mongodb-test-ca.key 4096 openssl req -new -x509 -days 1826 -key mongodb-test-ca.key -out mongodb-test-ca.crt -config openssl-test-ca.cnf openssl genrsa -out mongodb-test-ia.key 4096 openssl req -new -key mongodb-test-ia.key -out mongodb-test-ia.csr -config openssl-test-ca.cnf openssl x509 -sha256 -req -days 730 -in mongodb-test-ia.csr -CA mongodb-test-ca.crt -CAkey mongodb-test-ca.key -set_serial 01 -out mongodb-test-ia.crt -extfile openssl-test-ca.cnf -extensions v3_ca cat mongodb-test-ca.crt mongodb-test-ia.crt > test-ca.pem
尝试将tlsCertificateKeyFile指定为mongodb-test-ca.key或mongodb-test-ia.key均未解决问题,需排查操作错误点。
错误原因与修正方案
核心错误点
--tlsCertificateKeyFile参数要求传入包含服务端证书+对应私钥的合并PEM文件,单独的证书文件或私钥文件都不符合要求:
- 初始启动参数中,该参数指向了仅含证书的
mongodb-test-ca.crt,缺少私钥信息; - 后续尝试指向单独的私钥文件(
mongodb-test-ca.key/mongodb-test-ia.key),又缺少证书内容,导致MongoDB无法读取完整的密钥对。
修正步骤
1. 生成合法的服务端证书文件
将你生成的服务端证书mongodb-test-ia.crt和对应私钥mongodb-test-ia.key合并为一个PEM文件:
cat mongodb-test-ia.crt mongodb-test-ia.key > mongodb-server.pem
注意:确保文件包含完整的PEM标记(
-----BEGIN CERTIFICATE-----/-----END CERTIFICATE-----、-----BEGIN RSA PRIVATE KEY-----/-----END RSA PRIVATE KEY-----),顺序为证书在前、私钥在后。
2. 修正启动参数
将tlsCertificateKeyFile指向合并后的合法文件,其余参数保持不变:
--auth --tlsMode requireTLS --tlsCertificateKeyFile /etc/ssl/mongodb-server.pem --tlsCAFile /etc/ssl/test-ca.pem --oplogSize 32 --quiet --replSet myreplicaset --logpath /dev/stdout
3. 验证证书有效性
用OpenSSL命令验证合并后的证书文件是否合法:
openssl verify -CAfile test-ca.pem mongodb-server.pem
输出mongodb-server.pem: OK则表示证书链验证通过。
额外注意事项
- 不要将CA根证书(
mongodb-test-ca.crt)作为服务端证书使用,CA根证书仅用于签署其他证书; - 确保minikube容器内的证书文件权限正确,建议设置为
600(仅所有者可读),避免MongoDB因权限问题无法读取文件。
内容的提问来源于stack exchange,提问作者Carabes

