如何解决MongoDB Atlas副本集连接Play Framework 2.7应用的SSL异常问题
故障原因
- ReactiveMongo 0.17.1版本内置的Netty SSL实现与MongoDB Atlas强制要求的TLS 1.2+协议不兼容,该版本发布于2019年,存在TLS握手、SNI处理相关的已知缺陷,连接Atlas的SRV地址时会触发SSL会话提前中断。
- 0.17.1版本对
mongodb+srv协议的支持不完善,无法自动识别协议隐含的SSL启用、副本集自动发现等配置,会出现握手失败的问题。 - Play 2.7默认的JVM加密套件配置未适配Atlas要求的加密规则,进一步放大了SSL连接的兼容性问题。
可行解决方案
优先方案(兼容性最好)
升级ReactiveMongo到0.20.11及以上版本,该版本专门修复了MongoDB Atlas连接的SSL、SRV解析类bug,是适配Play 2.7的稳定版本,升级后直接使用Atlas提供的原始+srv连接字符串即可正常连接,无需额外修改配置。
兼容方案(无法升级版本时使用)
如果受项目依赖约束无法升级ReactiveMongo版本,按以下步骤修改配置:
- 替换
mongodb+srv协议为普通mongodb协议,手动指定所有副本集节点、副本集名称、认证源等参数,同时显式开启SSL,示例配置如下:
mongodb.uri = "mongodb://<username>:<password>@cluster0-shard-00-00.pwe0y.mongodb.net:27017,cluster0-shard-00-01.pwe0y.mongodb.net:27017,cluster0-shard-00-02.pwe0y.mongodb.net:27017/myFirstDatabase?ssl=true&replicaSet=atlas-xxxxxx-shard-0&authSource=admin&retryWrites=true&w=majority"
注:副本集节点地址、副本集名称可在Atlas控制台的集群详情页查询,账号密码、数据库名替换为你自己的实际配置。
- 在
application.conf中额外添加ReactiveMongo SSL配置:
mongodb.ssl.enabled = true mongodb.ssl.invalidHostNameAllowed = false
- 启动项目时添加JVM参数强制启用TLS 1.2:
sbt run -Djdk.tls.client.protocols="TLSv1.2"
内容的提问来源于stack exchange,提问作者jesus g_force Harris
相关产品推荐
相关产品推荐

