В моей программе есть немного кода, который устанавливает соединение через сокет, а затем записывает на удаленный сервер.
//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, но это символическая ссылка на это одно каноническое расположение.
На данный момент я не понимаю, почемуЯ все еще получаю эту ошибку;любые предложения или решения приветствуются. Спасибо.