MONGODB-X509认证连接MongoDB出现超时及流读取异常求助
问题排查:.NET驱动X509认证连接MongoDB超时
核心差异分析
你的.NET连接字符串connectionUri3与Compass可正常连接的字符串存在关键差异:
- .NET连接字符串包含
tlsInsecure=true参数 - Compass连接字符串无此参数,且你的程序运行在Ubuntu环境,需使用Linux格式的证书路径
排查步骤与解决方案
1. 移除tlsInsecure=true参数
MongoDB服务配置了--tlsMode requireTLS,要求严格的TLS验证,但tlsInsecure=true会跳过证书有效性检查,导致握手过程中服务器主动关闭连接,触发EndOfStreamException。
修改后的连接字符串:
const string connectionUri3 = "mongodb://Mongodb:27020/?authMechanism=MONGODB-X509&tls=true&tlsCertificateKeyFile=/opt/mongodb/ssl/mongodb.pem&tlsCAFile=/opt/mongodb/ssl/ca.pem&authSource=$external";
2. 确认证书路径与文件权限
- 替换占位符
/path/to/为实际证书路径(从MongoDB服务配置看,证书在/opt/mongodb/ssl/目录下) - 确保运行.NET程序的用户对证书文件有读权限,执行以下命令授权:
sudo chmod 644 /opt/mongodb/ssl/ca.pem /opt/mongodb/ssl/mongodb.pem sudo chown $USER /opt/mongodb/ssl/ca.pem /opt/mongodb/ssl/mongodb.pem
3. 验证证书完整性
- 检查
mongodb.pem是否包含证书+私钥的完整内容,格式示例:
-----BEGIN CERTIFICATE----- ...证书内容... -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- ...私钥内容... -----END PRIVATE KEY-----
- 用OpenSSL验证证书链有效性:
openssl verify -CAfile /opt/mongodb/ssl/ca.pem /opt/mongodb/ssl/mongodb.pem
4. 强制.NET使用TLS 1.2+
MongoDB 7.0默认要求TLS 1.2或更高版本,在程序启动时添加以下代码:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls13;
5. 确认MongoDB监听端口
检查MongoDB是否确实在27020端口监听:
ss -tulpn | grep 27020
如果端口未监听,需修改MongoDB配置文件(/etc/mongod.conf)的net.port参数,重启服务。
6. 调整连接超时参数(可选)
若网络存在延迟,可增加连接超时时间:
settings.ConnectTimeout = TimeSpan.FromSeconds(60); settings.ServerSelectionTimeout = TimeSpan.FromSeconds(60);
验证修改
修改后重新运行程序,若仍报错,可开启MongoDB驱动的详细日志定位问题:
var settings = MongoClientSettings.FromConnectionString(connectionUri3); settings.ServerApi = new ServerApi(ServerApiVersion.V1); settings.ClusterConfigurator = cb => cb.Subscribe<CommandStartedEvent>(e => { Console.WriteLine($"Command: {e.Command.ToJson()}"); });
内容的提问来源于stack exchange,提问作者dibii
相关产品推荐
相关产品推荐

