Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Sockets Tomcat作为客户端通过SSL与多个分离的服务器通信_Sockets_Tomcat - Fatal编程技术网

Sockets Tomcat作为客户端通过SSL与多个分离的服务器通信

Sockets Tomcat作为客户端通过SSL与多个分离的服务器通信,sockets,tomcat,Sockets,Tomcat,以下是场景: 我现在有多个应用服务器在本地运行(应该在不同的主机上运行)-->每个应用服务器都在不同的端口(在本地主机上)上侦听 我有一个在Tomcat上运行的客户端应用程序 启动Tomcat时,使用不同的用户详细信息登录,远程连接到不同的(以上)服务器 我的问题是: 首先,我启动Tomcat并以userA身份登录,然后它成功地连接到serverA(localhost:1000) 然后我注销了 再次以userB登录,未按预期连接到serverB(localhost:1001);相反,它给出

以下是场景:

  • 我现在有多个应用服务器在本地运行(应该在不同的主机上运行)-->每个应用服务器都在不同的端口(在本地主机上)上侦听
  • 我有一个在Tomcat上运行的客户端应用程序
  • 启动Tomcat时,使用不同的用户详细信息登录,远程连接到不同的(以上)服务器
我的问题是:

  • 首先,我启动Tomcat并以userA身份登录,然后它成功地连接到serverA(localhost:1000)
  • 然后我注销了
  • 再次以userB登录,未按预期连接到serverB(localhost:1001);相反,它给出了例外 “javax.net.ssl.SSLHandshakeException:收到致命警报:证书\u未知”
  • 但是,如果我重新启动Tomcat,并首先以userB身份登录,它就会成功地连接到serverB
有人知道问题出在哪里吗? 我非常感谢您的建议:)

客户端Tomcat的代码:

SetupClientKeystore();
SetupServerKeystore();
SSLContext context = SetupSSLContext();
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket) socketFactory.createSocket(hostname, portNo);
GZIPOutputStream gZipOut = new GZIPOutputStream(socket.getOutputStream()); // no trust certificate found throws here
服务器A和B的代码:

setupClientKeyStore();
setupServerKeystore();
setupSSLContext();
server = new ServerSocket(portNo);
SSLServerSocketFactory socketFactory = sslContext.getServerSocketFactory();
serverSocket = (SSLServerSocket) socketFactory.createServerSocket(portNo);
serverSocket.setNeedClientAuth(true);
while ( true )   
{
    Socket client = serverSocket.accept();
inStream = client.getInputStream();
    BufferedInputStream bufferedIn = new BufferedInputStream(inStream); //unknown_certificate throws here
    //do something here.....
}
“javax.net.ssl.SSLHandshakeException:收到致命警报: 证书“未知”

这通常表示服务器的证书不受信任。
是否当您以userA身份登录时,您加载了serverA的受信任证书并进行连接,然后当您尝试连接到serverB时,您尝试使用serverA的证书对serverB进行身份验证(当您以userA身份登录时加载)?
因此,SSL握手失败。
因此,当您重新启动并以userB身份登录时,会加载相应的证书(即ServerB的证书),并且连接成功?

你的帖子中没有代码,但如果你按照我说的做,这就解释了例外情况

你所说的“连接”是什么意思?你会从Tomcat向ServerA和ServerB调用web服务吗?谢谢你的及时回复,我所说的“连接”是指“打开到ServerA的sslsocket连接并通过它发送/接收内容”。你能给我们看一下调用外部服务器的代码吗?我以前曾想过,但仍然无法调试它。我几分钟前才发现那只虫子。谢谢你的帮助:)这就是问题所在?你没有重新加载信任库?