1

我有一个带有一台服务器和一个客户端的客户端/服务器进程。

连接设置如下所示:

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

我一直在以堆栈溢出为例,但一切似乎都过于复杂。有没有一种简单的方法来管理这个?或者一个进程不应该使用多个密钥存储的令人信服的理由?

4

1 回答 1

1

我认为使用您的方法是不可能的。由于您正在设置系统属性(这是一个哈希表),因此您编写的最后一个属性将覆盖较早的属性。

而且,我不明白用例。一般来说,信任库是一个客户端概念。这是关于确定要信任的服务器。大多数时候(除非您使用基于证书的身份验证)客户端的可信度是不相关的。

话虽如此,可以为不同的端口设置不同的密钥库。例如在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 可能正是你想要的。

于 2013-01-10T19:58:50.700 回答