gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:51:52 24 4
gpt4 key购买 nike

场景如下:

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

我的问题是:

  • 首先,我启动 Tomcat 并以 userA 身份登录,然后它成功连接到 serverA(localhost:1000)。
  • 然后我注销了。
  • 以 userB 身份再次登录,它没有按预期连接到 serverB(localhost:1001);相反,它给出了异常(exception)“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.....
}

最佳答案

"javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown"

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

关于sockets - Tomcat 作为客户端通过 SSL 与多个独立的服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com