Tomcat作为客户端通过SSL与多个独立的服务器通信

时间:2011-09-28 15:53:45

标签: sockets tomcat

以下是该方案:

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

我的问题是:

  • 首先,我启动Tomcat并以userA身份登录,然后成功连接到serverA(localhost:1000)。
  • 然后我退出了。
  • 再次以userB身份登录,未按预期连接到serverB(localhost:1001);相反,它给了例外 “javax.net.ssl.SSLHandshakeException:收到致命警报:certificate_unknown”
  • 但是,如果我重新启动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.....
}

1 个答案:

答案 0 :(得分:0)

  

“javax.net.ssl.SSLHandshakeException:收到致命警报:   certificate_unknown“

这通常表示服务器的证书不受信任 可能是当您以userA身份登录时加载serverA的可信证书并连接,然后当您尝试连接到serverB时,尝试使用ServerA证书验证serverB(以userA身份登录时加载)?
因此,SSL握手失败 因此,当您重新启动并以userB身份登录时,会加载相应的证书(即ServerB),并且连接成功了吗? 您的帖子中没有代码,但如果您按照我的说法执行此操作,则说明异常。