Java SSL cacerts работает только на локальной машине - PullRequest
0 голосов
/ 20 октября 2019

В моей программе есть немного кода, который устанавливает соединение через сокет, а затем записывает на удаленный сервер.

        //Get Socket, set timeout, and initialize I/O streams
        SSLSocket sock = null;
        try {
            InetAddress host = InetAddress.getByName("212.32.251.215");
            int port = 55540;
            SSLSocketFactory sslsocketfactory = (SSLSocketFactory) 
            SSLSocketFactory.getDefault();
            sock = (SSLSocket) sslsocketfactory.createSocket(host, port);
        } catch (Exception e) {
             e.printStackTrace();
        } 
        sock.setSoTimeout(100000);
        OutputStream out = sock.getOutputStream();
        BufferedInputStream in = new BufferedInputStream(sock.getInputStream());

        //Get Message (Compress and Encrypt)
        byte[] msg = buildMsg();

        //Send message to Server
        out.write(msg);
        out.flush();

На моей локальной машине все работает нормально, но на моем облачном сервере я получаю знакомую ошибку - javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target.

Я гарантировал, что сертификат находится в клетках с keytool -list -v -keystore /etc/pki/java/cacerts -alias myalias. Я также проверил, что этот cacerts является хранилищем доверенных сертификатов по умолчанию для моего Java-приложения с System.getProperty("javax.net.ssl.trustStore");, который возвращает /etc/pki/java. При этом я даже попробовал System.setProperty("javax.net.ssl.trustStore", "/etc/pki/java/cacerts");, как это было предложено кем-то, кто сказал, что Tomcat пропустил их TrustStore по умолчанию. Кроме того, да, это местоположение cacerts для всех версий jre на моем сервере, у каждого jre есть cacerts, но это символическая ссылка на это одно каноническое расположение.

На данный момент я не понимаю, почемуЯ все еще получаю эту ошибку;любые предложения или решения приветствуются. Спасибо.

1 Ответ

0 голосов
/ 20 октября 2019

Я решил исправить это, явно создав хранилище trustStore, не полагаясь на java, чтобы найти его.

        KeyStore trustStore = KeyStore.getInstance("JKS");
        trustStore.load(new FileInputStream(mypath), password.toCharArray());

        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(trustStore);

        SSLContext sslcontext = SSLContext.getInstance("SSLv3");
        sslcontext.init(null, tmf.getTrustManagers(), null);

        SSLSocketFactory sslsocketfactory = sslcontext.getSocketFactory();

        InetAddress host = InetAddress.getByName("212.32.251.215");
        int port = 55540;

        sslsocket = (SSLSocket) sslsocketfactory.createSocket(host, port);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...