【发布时间】:2019-10-20 16:13:40
【问题描述】:
我的程序中有一段代码设置了一个套接字连接,然后写入远程服务器。
//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 中。我还检查了这个 cacerts 是我的 java 应用程序的默认信任库,System.getProperty("javax.net.ssl.trustStore"); 返回/etc/pki/java。话虽如此,我什至尝试过System.setProperty("javax.net.ssl.trustStore", "/etc/pki/java/cacerts");,正如有人说 Tomcat 忽略了他们的默认 trustStore 所建议的那样。另外,是的,这是我服务器中所有 jre 版本的 cacerts 位置,每个 jre 都有一个 cacerts 但它是指向这个规范位置的符号链接。
此时我不知道为什么我仍然会收到此错误;任何建议或解决方案表示赞赏。谢谢。
【问题讨论】:
标签: java ssl-certificate