仅在本地计算机上工作的Java SSL cacerts
我的程序中有一段代码设置套接字连接,然后写入远程服务器仅在本地计算机上工作的Java SSL cacerts,java,ssl-certificate,Java,Ssl Certificate,我的程序中有一段代码设置套接字连接,然后写入远程服务器 //Get Socket, set timeout, and initialize I/O streams SSLSocket sock = null; try { InetAddress host = InetAddress.getByName("212.32.251.215"); int port = 55540; S
//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路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径
我已确保证书位于cacerts中,带有keytool-list-v-keystore/etc/pki/java/cacerts-alias myalias
。我还使用System.getProperty(“javax.net.ssl.truststore”);检查了这个cacerts是否是我的java应用程序的默认信任库
返回/etc/pki/java
。尽管如此,我甚至尝试了System.setProperty(“javax.net.ssl.trustStore”,“etc/pki/java/cacerts”)有人说Tomcat忽略了他们默认的信任库。此外,是的,这是我的服务器中所有jre版本的cacerts位置,每个jre都有一个cacerts,但它是指向这个规范位置的符号链接
在这一点上,我不知道为什么我仍然得到这个错误;欢迎提出任何建议或解决方案。谢谢。我最终通过显式创建信任库解决了这个问题,而不是依靠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);
“依靠Java来找到它”是什么意思?Java没有魔力。信任库可以在JVM级别(cacerts)上定义,也可以在应用程序服务器(例如Tomcat)内定义,前提是您的应用程序在这样的环境中运行,或者在应用程序代码本身中运行。您也可以使用环境变量来设置信任库。。。