Mongo Java客户端:如何在启用SSL但没有证书的情况下连接?
为了进行测试,我设置了一个mongodb服务器,它允许无证书的ssl连接。我能够使用RoboMongo和mongo-c-driver以这种方式连接,但是当我尝试Java时,我得到:Mongo Java客户端:如何在启用SSL但没有证书的情况下连接?,java,mongodb,ssl,mongo-java,mongo-java-driver,Java,Mongodb,Ssl,Mongo Java,Mongo Java Driver,为了进行测试,我设置了一个mongodb服务器,它允许无证书的ssl连接。我能够使用RoboMongo和mongo-c-driver以这种方式连接,但是当我尝试Java时,我得到: {javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有
{javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径},原因是{sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径},原因是{sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径}
我尝试将套接字工厂设置为使用默认套接字,但得到:
com.mongodb.mongonternalexception:SSL已启用,但套接字不是javax.net.SSL.SSLSocket的实例
如何建立此连接?因此基于通用SSL和ZZ编码器
MongoClient mongoClient = new MongoClient(serverAddress,
Collections.singletonList(mongoCredential), MongoClientOptions.builder().sslEnabled(true).socketFactory(getNoopSslSoketFactory()).build());
private static SSLSocketFactory getNoopSslSocketFactory() {
SSLContext sslContext;
try {
sslContext = SSLContext.getInstance("SSL");
// set up a TrustManager that trusts everything
sslContext.init(null, new TrustManager[] { new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { }
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { }
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}}, new SecureRandom());
} catch (NoSuchAlgorithmException | KeyManagementException e) {
LOG.error("Couldn't create SSL Context for MongoDB connection", e);
throw new RuntimeException(e);
}
return sslContext.getSocketFactory();
}
```@EJP您想详细说明一下吗?连接仍然使用SSL加密,但没有信任证书,因此双方都不确定与谁通信。我同意这远没有那么安全,但这是一种可以用于MongoDb的配置,我需要对其进行测试。当然,我的两个实例都在测试环境中并使用测试数据,正如我所提到的,这绝不是测试的一部分,测试有效用例。不知道你为什么会因为这个@EJP而生气