我有一个服务器和一个客户端的客户端/服务器进程。
连接设置如下:
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查看示例,但一切看起来都过于复杂。有一种简单的方法来管理它吗?还是一个令人信服的理由,即一个进程不应该使用多个密钥库?
答案 0 :(得分: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可能正是您想要的。