Can';t从JAVA连接到Mongo SSL副本集
我正在尝试使用SSL加密设置MongoDB的最新版本,我可以从MongoShell进行连接,但当我从Java客户端进行连接时,遇到了一个错误 有效 mongo管理员--主机mongo1.xxxx.com--ssl--sslPEMKeyFile mongoClient.pem--sslCAFile mongoCA.crt 不起作用Can';t从JAVA连接到Mongo SSL副本集,java,mongodb,ssl,ssl-certificate,Java,Mongodb,Ssl,Ssl Certificate,我正在尝试使用SSL加密设置MongoDB的最新版本,我可以从MongoShell进行连接,但当我从Java客户端进行连接时,遇到了一个错误 有效 mongo管理员--主机mongo1.xxxx.com--ssl--sslPEMKeyFile mongoClient.pem--sslCAFile mongoCA.crt 不起作用 public static void main(String args[]){ System.setProperty("javax.net.ssl.trustS
public static void main(String args[]){
System.setProperty("javax.net.ssl.trustStore","/home/gasparms/truststore.ts");
System.setProperty("javax.net.ssl.trustStorePassword", "mypasswd");
System.setProperty("javax.net.ssl.keyStore", "/home/gasparms/truststore.ts");
System.setProperty("javax.net.ssl.keyStorePassword", "mypasswd");
System.setProperty("javax.security.auth.useSubjectCredsOnly","false");
MongoClientOptions options = MongoClientOptions.builder().sslEnabled(true)
.build();
MongoClient mongoClient = new MongoClient("mongo1.xxxx.com",options);
System.out.println(mongoClient.getDatabaseNames());
}
我从Mongo方面得到这个错误:
2015-06-09T15:08:14.431Z I网络[initandlisten]连接
从192.168.33.1:38944#585接受(3个连接现在打开)
2015-06-09T15:08:14.445Z电子网络[conn585]无SSL证书
由同行提供;连接被拒绝2015-06-09T15:08:14.445Z I
网络[conn585]端连接192.168.33.1:38944(2个连接
现在打开)2015-06-09T15:08:14.828Z I网络[conn580]端连接
192.168.33.13:39240(1个连接现在打开)
在java客户端程序中
INFORMACIÓN:连接到服务器时监视器线程中出现异常
mongo1.xxxx.com:27017 com.mongodb.mongoScope异常:
提前到达流的末端
com.mongodb.connection.SocketStream.read(SocketStream.java:88)位于
com.mongodb.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:491)
在
com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:221)
在
com.mongodb.connection.CommandHelper.receiveReply(CommandHelper.java:134)
在
com.mongodb.connection.CommandHelper.receiveCommandResult(CommandHelper.java:121)
在
com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:32)
在
com.mongodb.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:83)
在
com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:43)
在
com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115)
在
com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunName.run(DefaultServerMonitor.java:127)
运行(Thread.java:745)
证书的创建
我有mongoCA.crt和mongoClient.pem,它们与mongoshell一起工作。然后,我想将.pem和.crt导入java密钥库
openssl x509 -outform der -in certificate.pem -out certificate.der
keytool -import -alias MongoDB-Client -file certificate.der -keystore truststore.ts -noprompt -storepass "mypasswd"
keytool -import -alias "MongoDB-CA" -file mongoCA.crt -keystore truststore.ts -noprompt -storepass "mypasswd"
我做错了什么?我也有同样的问题,对我来说,这是我创建密钥库的方式的问题。我注意到您对信任库和密钥库都使用了相同的文件truststore.ts。这是可行的,但我建议使用单独的文件以避免混淆 我已经为根CA和mongo用户创建了.pem文件,并且能够成功地使用它们连接mongo shell。我从中创建了truststore.jks和keystore.jks 首先,要创建truststore.jks,我运行了:
keytool -import -alias root -storepass mypass -keystore truststore.jks -file rootca.pem -noprompt
对于keystore.jks,您需要公钥和私钥,因此首先将PEM文件转换为PKCS12格式,然后导入到jks:
openssl pkcs12 -export -out myuser.pkcs12 -in myuser.pem -password pass:mypass
keytool -importkeystore -srckeystore myuser.pkcs12 -srcstoretype PKCS12 -destkeystore keystore.jks -deststoretype JKS -deststorepass mypass -srcstorepass mypass
您确定服务器正在启用ssl的情况下运行吗?尝试在没有任何ssl配置的情况下进行连接(通过cli/shell和java驱动程序)以进行验证。是的,mongo admin--host mongo1.xxxx.com--ssl--sslPEMKeyFile mongoClient.pem--sslCAFile mongoCA.crt起作用,但mongo admin--host mongo1.xxxx.com不起作用。日志说这不可能完全解决我的问题。你找到解决办法了吗?