Hi,
I am connecting to my MongoDB which is running on a remote server. I enabled SSL in the mongod config by giving the certificateKeyFile, mode and CAFile. I gave my pem file to the certificateKeyFIle argument.
I built a small jar file establishing connection to this mongoDB while setting the truststore and keystore path to my pem file. But I am so far unsuccessful in trying to make this work. Please help in identifying what I am missing here.
java code:
public class mondb {
private static MongoClient mongoClient;
public static void main(String[] args) throws NoSuchAlgorithmException, KeyManagementException {
System.setProperty("javax.net.ssl.trustStore", "mongo.pem");
System.setProperty("javax.net.ssl.trustStorePassword", "mypassword");
System.setProperty("javax.net.ssl.keyStore", "mongo.pem");
System.setProperty("javax.net.ssl.keyStorePassword", "mypassword");
SSLContext ssl_ctx = SSLContext.getInstance("TLSv1.2");
TrustManager[] trust_mgr = get_trust_mgr();
ssl_ctx.init(null, trust_mgr, new SecureRandom());
List<ServerAddress> serverAddressArray = new ArrayList<ServerAddress>();
serverAddressArray.add(new ServerAddress("xyz.com", 27017));
MongoClientOptions options = new MongoClientOptions.Builder().sslContext(ssl_ctx)
.sslEnabled(true)
.readPreference(ReadPreference.primaryPreferred())
.build();
MongoClient mongoClient = new MongoClient(serverAddressArray, options);
try {
mongoClient.getAddress();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
private static TrustManager[] get_trust_mgr() {
// TODO Auto-generated method stub
TrustManager[ ] certs = new TrustManager[ ] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; }
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
}
};
return certs;
}
}
The error stack trace is as follows:
INFO: Exception in monitor thread while connecting to server xyz: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:579)
at com.mongodb.internal.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:444)
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:298)
at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:258)
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:129)
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.lang.Thread.run(Thread.java:748)
Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=xyz:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketReadException: Prematurely reached end of stream}}]