SSL включен, но сокет не является экземпляром соединения java mongodb с javax.net.ssl.SSLSocket - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь подключить MongoDB с включенным SSL / TLS и самозаверяющими сертификатами.Я загрузил самоподписанный сертификат в свои локальные машины.Но получая исключение

SSL is enabled but the socket is not an instance of javax.net.ssl.SSLSocket

Ссылки: Подключение к MongoDb с помощью SSL из приложения JAVA

Проблема с приведенным ниже кодом, он принимает все сертификаты.Я хотел, чтобы он был ограничен самозаверяющим сертификатом, который является доверенным сертификатом jvm

    public static void main(String args[])  throws Exception {

         String JAVA_HOME="C:\\Program Files\\Java\\jre1.8.0_211";
         System.setProperty ("javax.net.ssl.trustStore",JAVA_HOME + "\\lib\\security\\cacerts");
         System.setProperty ("javax.net.ssl.trustStorePassword","yyyy");
         System.setProperty ("javax.net.ssl.keyStore",JAVA_HOME + "\\lib\\security\\mongo.pkcs12");
         System.setProperty ("javax.net.ssl.keyStorePassword","xxxx");

         MongoClientURI connectionString;
         String uri = "mongodb://ttt:rrr@1.1.1.1:17017/db?authMechanism=SCRAM-SHA-1";
         MongoClientOptions.Builder optionsBuilder;

         optionsBuilder = MongoClientOptions.builder()
                 .sslEnabled(true)
                 .sslInvalidHostNameAllowed(true)
                 .socketFactory(getSSF());

         connectionString = new MongoClientURI(uri, optionsBuilder);
         MongoClient m = new MongoClient(connectionString);
         DB db = m.getDB( "db" );
         DBCollection c = db.getCollection( "mongostudent");

         System.out.println( c.findOne() );
    }

    private static SSLSocketFactory getSSF() throws  NoSuchAlgorithmException, KeyManagementException{
        SSLContext sslContext;

        sslContext = SSLContext.getInstance("TLSv1.2");
        sslContext.init((KeyManager[])null, new TrustManager[]{new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {

                System.out.println("Certificate:"+x509Certificates[0]);
            }

            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {

                System.out.println("Certificate:"+x509Certificates[0]);
            }

            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }}, new SecureRandom());

        return sslContext.getSocketFactory();
    }
}

Используемая команда Keytool:

  1. keytool -import -trustcacerts -file C:/certificateauth.pem -keystore cacertskeystore.jks -storepass "xxxx"

  2. поместил файл pkcs в папку безопасности

Мне нужно настроить его таким образом, чтобы он принимал только доверенные сертификаты.

...