Tomcat как клиенты, взаимодействующие с несколькими отдельными серверами через SSL - PullRequest
0 голосов
/ 28 сентября 2011

Вот сценарий:

  • У меня есть несколько серверов приложений, работающих на данный момент локально (должны быть запущены на разных хостах) -> каждый прослушивает свой порт (на локальном хосте).
  • У меня есть одно клиентское приложение, работающее на Tomcat.
  • При запуске Tomcat войдите в систему с различными данными пользователя, подключившись к разным (указанным выше) серверам.

Моя проблемаis:

  • Сначала я запустил Tomcat и вошел в систему как пользователь A, затем он успешно подключился к серверу A (localhost: 1000).
  • Затем я вышел из системы.
  • Снова вошел в систему как пользователь B, он НЕ подключился к серверу B (localhost: 1001), как ожидалось;вместо этого он выдал исключение «javax.net.ssl.SSLHandshakeException: получено фатальное оповещение: certificate_unknown»
  • Однако, если я перезапущу Tomcat и сначала войду в систему как userB, он затем успешно подключится к серверу B.

Кто-нибудь знает в чем проблема?Я действительно ценю любое предложение:)

Код для клиента 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 голосов
/ 28 сентября 2011

"javax.net.ssl.SSLHandshakeException: получено фатальное предупреждение: Certificate_unknown "

Обычно это означает, что сертификат сервера не является доверенным.
Может ли быть так, что когда вы входите в систему как пользователь А, вы загружаете доверенный сертификат сервера А и подключаетесь, а затем, когда вы пытаетесь подключиться к серверу В, вы пытаетесь аутентифицировать сервер В, используя сертификат сервера А (загруженный при входе в систему как пользователь А)?
В результате происходит сбой рукопожатия SSL.
Таким образом, когда вы перезагружаетесь и входите в систему как userB, загружается соответствующий сертификат (т.е. ServerB), и соединение успешно?
У вас нет кода в вашем сообщении, но если вы делаете это, как я говорю, это объясняет исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...