Linux环境下SslStream忽略指定SslProtocols默认使用TLS v1导致MongoDB连接失败
问题解决方案
快速修复(优先尝试)
1. 强制MongoDB驱动指定TLS 1.2版本
MongoDB 2.12.4版本驱动支持显式配置TLS协议版本,两种配置方式二选一即可:
- 连接字符串追加参数:在原有连接串末尾加上
tls=true&tlsMinProtocol=TLS1_2 - 代码层面配置MongoClientSettings:
var settings = MongoClientSettings.FromConnectionString("你的MongoDB连接串"); settings.SslSettings = new SslSettings { EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12 }; var mongoClient = new MongoClient(settings);
2. 配置.NET运行时密码套件优先级
如果第一步配置后仍然报错,是因为新AMI中.NET运行时和OpenSSL的密码套件适配逻辑异常,针对27017这类非HTTPS默认端口的握手请求,会错误匹配低版本套件,在Elastic Beanstalk环境变量中添加如下配置即可解决:
| 变量名 | 变量值 |
|---|---|
DOTNET_SYSTEM_NET_SECURITY_DEFAULT_CIPHER_SUITES_PRIORITY | ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 |
永久修复(系统层面禁用低版本TLS)
如果需要从系统层面彻底避免TLS版本降级问题,可以在应用的.ebextensions目录下新增配置文件(比如命名为tls-policy.config),内容如下:
files: /etc/crypto-policies/local.d/disable-old-tls.config: mode: "000644" owner: root group: root content: | MinProtocol = TLSv1.2 CipherString = DEFAULT@SECLEVEL=2 commands: update_crypto_policy: command: update-crypto-policies --set DEFAULT:NO-TLS1.0:NO-TLS1.1
重新部署应用后,系统会全局禁用TLS 1.0、TLS 1.1,所有SSL连接默认使用TLS 1.2及以上版本。
底层问题定位方法
如果需要进一步排查AMI的具体变更点,可以用以下两个方法调试:
- 开启.NET网络调试日志:添加三个环境变量
COMPlus_LogEnable=1、COMPlus_LogLevel=4、COMPlus_LogFacility=0x20000000,运行程序后会输出SslStream和OpenSSL交互的完整握手日志,可查看协商的协议版本、密码套件参数。 - 用strace跟踪系统调用:在服务器上执行
strace -e trace=network,ssl 你的测试程序执行路径,可以直接看到.NET调用OpenSSL的底层参数,确认TLS版本传递是否正确。
验证前置条件:先在服务器上执行命令 openssl s_client -connect 你的MongoDB地址:27017 -tls1_2,如果能正常连接,说明系统OpenSSL本身对MongoDB的TLS 1.2支持正常,问题仅出在.NET运行时的适配逻辑,以上方案均可解决。
内容的提问来源于stack exchange,提问作者alexs
相关产品推荐
相关产品推荐

