我有一个包含一台服务器和一个客户端的客户端/服务器进程。
连接设置如下所示:
System.setProperty("javax.net.ssl.trustStore", "path/to/store");
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
sslsocket = (SSLSocket) sslsocketfactory.createSocket(InetAddress.getLocalHost(), port);
1:1,这很好用。现在我正在扩展它,以便服务器正在为多个客户端监听多个端口。每个连接到服务器的客户端都应该在具有特定信任库的特定端口上进行连接。
如果我在服务器端注册了两个信任库,当我尝试建立客户端连接时,我会收到错误消息:
javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown Received fatal alert: certificate_unknown
我一直在浏览 stack overflow举个例子,但一切似乎都过于复杂。有没有简单的方法来管理这个?或者一个进程不应使用多个 key 存储的令人信服的理由?
最佳答案
我不认为使用你的方法这是可能的。由于您正在设置一个系统属性(这是一个哈希表),您最后写的将覆盖之前的。
而且,我不了解用例。一般来说,信任库是一个客户端概念。它是关于确定要信任的服务器。大多数时候(除非您使用基于证书的身份验证)客户端的可信度是无关紧要的。
话虽如此,可以为不同的端口设置不同的 keystore 。以tomcat为例
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="${user.home}/.keystore1"
keystorePass="changeit"
clientAuth="false" sslProtocol="TLS" />
上面的代码片段指出应该使用端口 443 ~/.keystore1。在另一个端口上,可以使用 keystore2。
如果您想使用客户端身份验证,您可以强制客户端发送证书,在上面的示例中,通过将 clientAuth 设置为 true,并添加 truststoreFile 和 truststorePass。
深入了解 tomcat 的源代码可能会帮助您设置环境。特别是文件 java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java 可能正是您想要的。
关于Java 添加多个信任库,每个端口一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14265137/