【问题标题】:MongoDB "no SNI name sent" error from heroku java application来自heroku java应用程序的MongoDB“未发送SNI名称”错误
【发布时间】:2019-02-03 02:38:49
【问题描述】:

我跟随 this tutorial 将示例应用程序部署到 Heroku。我刚刚在MyResource 类中添加了以下方法,并从中返回了结果,而不是从getIt() 方法返回了"Hello World"。我正在连接到 atlas 免费层集群:

static String getMessage() {
        MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://<USER>:<PASSWORD>@cluster0-shard-00-00-2lbue.mongodb.net:27017,cluster0-shard-00-01-2lbue.mongodb.net:27017,cluster0-shard-00-02-2lbue.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin"));
        DB database = mongoClient.getDB("mastery");
        DBCollection collection = database.getCollection("summary");

        DBObject query = new BasicDBObject("_id", new ObjectId("5c563fa2645d6b444c018dcb"));
        DBCursor cursor = collection.find(query);

        return (String)cursor.one().get("message");
    }

这是我正在使用的驱动程序:

<dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongodb-driver</artifactId>
      <version>3.9.1</version>
</dependency>

这是我的导入:

import com.mongodb.*;

该应用程序在我的本地系统上运行良好。但是当我将应用程序部署到 Heroku 并点击服务时,我遇到了以下错误:

INFO: Exception in monitor thread while connecting to server cluster0-shard-00-01-2lbue.mongodb.net:27017
com.mongodb.MongoCommandException: Command failed with error 8000 (AtlasError): 'no SNI name sent, make sure using a MongoDB 3.4+ driver/shell.' on server cluster0-shard-00-01-2lbue.mongodb.net:27017. The full response is { "ok" : 0, "errmsg" : "no SNI name sent, make sure using a MongoDB 3.4+ driver/shell.", "code" : 8000, "codeName" : "AtlasError" }
at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:179)
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:299)
at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:255)
at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83)
at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33)
at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:106)
at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:63)
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:127)
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.lang.Thread.run(Thread.java:748)

这个 SNI 名称是什么?我可以理解驱动程序可以从我的机器上选择它,但不能从 Heroku 机器上选择它。但我对如何解决这个问题一无所知!有没有办法配置 Heroku 在驱动程序要求时显示 SNI 名称?我们可以从 Heroku 的某个地方手动获取这个值并将其直接提供给 MongoDB 驱动程序吗?任何帮助表示赞赏。

编辑: turned out 客户端提到它希望连接到的服务器的 SNI 名称作为 TLS 安全性的一部分。似乎有一种方法可以手动indicate the name in python driver。有没有办法从java做到这一点?仍然不明白为什么在本地运行应用程序时这不是问题。

【问题讨论】:

    标签: mongodb heroku mongodb-java sni mongodb-atlas


    【解决方案1】:

    我用来连接集群的代码被证明是错误的。我按照docs 的指示进行操作,它提到了这一点:

    要连接到 Atlas M0(免费层)集群,您必须使用 Java 版本 8 或更高版本,并使用支持 MongoDB 3.4。

    于是我将system.properties文件中的java版本改为1.8

    java.runtime.version=1.8
    

    之前设置为1.7。我还收到了关于我使用过的一种方法的弃用警告。所以我再次关注docs 使用最新的代码,它就像一个魅力。

    这里真正的收获是每次都参考官方文档:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多