草庐IT

java - 获取 com.mongodb.MongoSocketReadException : Prematurely reached end of stream- MongoDB

coder 2023-10-30 原文

我正在尝试将我的 Java 应用程序连接到 MongoDB 服务器。我正在使用

Java 8, mongodb 服务器 4.0.9, mongo-java-驱动程序:3.10.0

我能够连接到我的本地主机服务器,但是在连接到通过自签名启用 ssl 的远程服务器时出现以下错误。

INFO: Cluster created with settings {hosts=[host-name:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='300000 ms', maxWaitQueueSize=500}
Jun 07, 2019 3:33:36 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Cluster description not yet available. Waiting for 300000 ms before timing out
Jun 07, 2019 3:33:37 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Exception in monitor thread while connecting to server host-name:27017
    com.mongodb.MongoSocketReadException: Prematurely reached end of stream
    at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:112)
    at com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:570)
    at com.mongodb.internal.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:441)
    at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:295)
    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:105)
    at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:62)
    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)
Timed out after 300000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{host-name:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketReadException: Prematurely reached end of stream}}]

我在 mongod.conf 文件中注释掉了绑定(bind)地址。

 System.setProperty("javax.net.ssl.trustStore", "path\\cacerts");
 System.setProperty("javax.net.ssl.trustStorePassword", "xxxx");
 CountDownLatch latch = new CountDownLatch(1);
 MongoCredential credential = MongoCredential.createCredential("username", 
                            "dbname","xxxx".toCharArray());
 MongoClientSettings settings = MongoClientSettings.builder()
   .credential(credential)
   .applyToSslSettings(ssl -> { ssl.enabled(true); })
   .applyToClusterSettings(builder ->
    builder.serverSelectionTimeout(1, TimeUnit.MINUTES)
   .hosts(Arrays.asList(new ServerAddress("host-address", 27017))))
   .build();
 MongoClient mongoClient = MongoClients.create(settings);
 MongoDatabase database = mongoClient.getDatabase("sample");
 MongoCollection<Document> collection = database.getCollection("data");
 System.out.println(collection.countDocuments());

最佳答案

我终于解决了这个问题。它与 SSL 有关

我跳过了这两件事

1) 将客户端证书 PEM 文件导出为 pkcs12 格式

openssl pkcs12 -export -out mongodb.pkcs12 -in client.pem

2)添加以下代码行

 System.setProperty ("javax.net.ssl.keyStore", "path to java security folder\\mongodb.pkcs12");
 System.setProperty ("javax.net.ssl.keyStorePassword","changeit");

关于java - 获取 com.mongodb.MongoSocketReadException : Prematurely reached end of stream- MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56492529/

有关java - 获取 com.mongodb.MongoSocketReadException : Prematurely reached end of stream- MongoDB的更多相关文章

随机推荐