【问题标题】:use java connect Atlas MongoDB failed使用 java 连接 Atlas MongoDB 失败
【发布时间】:2020-01-29 23:23:20
【问题描述】:

使用java驱动连接atlas mongodb db时,出现SSLHandshakeException,如何解决?

      final ConnectionString  uriString = new ConnectionString ("mongodb+srv://XXX:XXX@cluster0-ddtis.azure.mongodb.net/test?retryWrites=true&w=majority");  
      MongoClient mongoClient = MongoClients.create(settings);        
      MongoDatabase database = mongoClient.getDatabase("test");

      System.out.println("Connect to database successfully");  

      MongoCollection<Document> collection = database.getCollection("movie");

      String dbs = mongoClient.listDatabaseNames().first();
      System.out.println("dbs" + dbs);         

2019-10-01 00:03:23 INFO org.mongodb.driver.cluster:76] 中的异常 连接服务器时监控线程 cluster0-shard-00-02-ddtis.azure.mongodb.net:27017 com.mongodb.MongoSocketWriteException:发送消息时出现异常 com.mongodb.internal.connection.InternalStreamConnection.translateWriteException(InternalStreamConnection.java:551) 在 com.mongodb.internal.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:433) 在 com.mongodb.internal.connection.InternalStreamConnection.sendCommandMessage(InternalStreamConnection.java:273) 在 com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:257) 在 com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83) 在 com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33) 在 com.mongodb.internal.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:105) 在 com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:62) 在 com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:129) 在 com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) 在 java.lang.Thread.run(Thread.java:748) 引起: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 在以下位置找到请求目标的有效认证路径 sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 在 sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1959) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) 在 sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514) 在 sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 在 sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026) 在 sun.security.ssl.Handshaker.process_record(Handshaker.java:961) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385) 在 sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:757) 在 sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) 在 com.mongodb.internal.connection.SocketStream.write(SocketStream.java:99) 在 com.mongodb.internal.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:430) ...省略了9个常见的框架原因: sun.security.validator.ValidatorException:PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 在以下位置找到请求目标的有效认证路径 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397) 在 sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302) 在 sun.security.validator.Validator.validate(Validator.java:260) 在 sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 在 sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) 在 sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) 在 sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496) ... 省略了 18 个常见帧 原因: sun.security.provider.certpath.SunCertPathBuilderException:无法 在以下位置找到请求目标的有效认证路径 sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 在 java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 在 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392)

...省略了 24 个常用帧

【问题讨论】:

标签: java mongodb mongodb-atlas


【解决方案1】:

原因可能是您的 jre/lib/security/ 文件夹的 cacerts 中不存在根证书问题,因此存在 SSL 问题。 您能否尝试使用 keytool 和 test 保存和导入以下证书: “ISRG 根 X1:https://letsencrypt.org/certs/isrgrootx1.pem.txt (IdenTrust) DST 根 CA X3:https://letsencrypt.org/certs/trustid-x3-root.pem.txt"

mongodb 手册提供了上述证书链接以解决任何连接问题,这里是文档链接: https://docs.atlas.mongodb.com/reference/faq/security/#tls-change-hard-code.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2021-02-14
    • 2018-06-13
    • 2021-01-18
    • 2019-08-11
    • 2019-12-10
    • 2022-06-20
    • 2020-08-16
    相关资源
    最近更新 更多