SSL Connection Mongo - premature end of stream

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}}]

You can try by set SSL Enabled to true,

Code:

public MongoClient mongoClient() {
List saList = new ArrayList<>();
saList.add(new ServerAddress("cluster0-shard-00-00-75shm.gcp.mongodb.net", 27017));
saList.add(new ServerAddress("cluster0-shard-00-01-75shm.gcp.mongodb.net", 27017));
saList.add(new ServerAddress("cluster0-shard-00-02-75shm.gcp.mongodb.net", 27017));

char[] pwd =  "password".toCharArray();
MongoCredential credential = MongoCredential.createCredential("username", "admin", pwd);

//set sslEnabled to true here
MongoClientOptions options = MongoClientOptions.builder()
        .readPreference(ReadPreference.primaryPreferred())
        .retryWrites(true)
        .requiredReplicaSetName("Cluster0-shard-0")
        .maxConnectionIdleTime(6000)
        .sslEnabled(true)
        .build();

MongoClient mongoClient = new MongoClient(saList, credential, options);     
return mongoClient;

Thanks for the reply,

I did set the sslEnabled as true in the options, but it did not work.