Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java添加多个信任存储,每个端口一个_Java_Ssl_Client Server_Keystore - Fatal编程技术网

Java添加多个信任存储,每个端口一个

Java添加多个信任存储,每个端口一个,java,ssl,client-server,keystore,Java,Ssl,Client Server,Keystore,我有一个客户机/服务器进程,其中有一个服务器和一个客户机 连接设置如下所示: System.setProperty("javax.net.ssl.trustStore", "path/to/store"); System.setProperty("javax.net.ssl.trustStorePassword", "passwd"); SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefa

我有一个客户机/服务器进程,其中有一个服务器和一个客户机

连接设置如下所示:

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

我一直在寻找一个例子,但一切似乎都太复杂了。有没有一个简单的方法来管理这个问题?或者一个进程不应该使用多个密钥存储的令人信服的原因?

我认为使用您的方法是不可能的。由于您正在设置一个系统属性(它是一个哈希表),所以最后一个写入的属性将覆盖前面的属性

但是,我也不理解这个用例。一般来说,truststore是一个客户端概念。这是关于确定信任哪台服务器的问题。大多数情况下(除非您使用的是基于证书的身份验证),客户机的可信度是不相关的

说到这里,可以为不同的端口设置不同的密钥库。例如,在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可能正是您想要的。

我认为使用您的方法不可能做到这一点。由于您正在设置一个系统属性(它是一个哈希表),所以最后一个写入的属性将覆盖前面的属性

但是,我也不理解这个用例。一般来说,truststore是一个客户端概念。这是关于确定信任哪台服务器的问题。大多数情况下(除非您使用的是基于证书的身份验证),客户机的可信度是不相关的

说到这里,可以为不同的端口设置不同的密钥库。例如,在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文件可能正是您想要的。

为什么?证书受信任或不受信任。端口与此无关。听起来好像您正试图使用身份验证作为强制授权的一种手段,不同的端口具有不同的授权要求。这不是PKI身份验证的目的。你是对的,我希望每个客户端都能够使用不同的密钥库和密码进行连接,以使两个客户端尽可能分开。也许某种授权设置更合适为什么?证书受信任或不受信任。端口与此无关。听起来好像您正试图使用身份验证作为强制授权的一种手段,不同的端口具有不同的授权要求。这不是PKI身份验证的目的。你是对的,我希望每个客户端都能够使用不同的密钥库和密码进行连接,以使两个客户端尽可能分开。也许某种授权设置更合适