我正在尝试使用SSL加密设置MongoDB的最新版本,我能够从mongo shell连接,但是当我从Java客户端连接时出现错误。
作品
mongo admin --host mongo1.xxxx.com --ssl --sslPEMKeyFile mongoClient.pem --sslCAFile mongoCA.crt
不起作用
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 NETWORK [initandlisten]连接 接受了来自192.168.33.1:38944#585(3个连接现已开放) 2015-06-09T15:08:14.445Z E NETWORK [conn585]没有SSL证书 由同行提供;连接被拒绝2015-06-09T15:08:14.445Z我 NETWORK [conn585] end connection 192.168.33.1:38944(2个连接 现在开放)2015-06-09T15:08:14.828Z I NETWORK [conn580]结束连接 192.168.33.13:39240(1个连接现已开启)
和java客户端程序
INFORMACIÓN:连接到服务器时监视器线程中的异常 mongo1.xxxx.com:27017 com.mongodb.MongoSocketReadException: 过早到达终点 com.mongodb.connection.SocketStream.read(SocketStream.java:88)at 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 $ ServerMonitorRunnable.run(DefaultServerMonitor.java:127) 在java.lang.Thread.run(Thread.java:745)
创建证书
我有使用mongo shell的mongoCA.crt和mongoClient.pem。然后,我想将.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"
我做错了什么?
答案 0 :(得分:3)
我遇到了同样的问题,对我而言,我发现密钥库的方式出现了问题。我注意到您对truststore和keystore使用相同的文件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