Как узнать, поддерживает ли сервер SSL? - PullRequest
1 голос
/ 16 февраля 2010

Мне нужно подключиться к хосту, если он в автономном режиме, я получаю тайм-аут TCP (и это нормально), и если он в сети с доступным SSL, я перехожу к фазе входа.

Проблема в том, что, когда сервер подключен к сети, принимает соединение через настроенный порт TCP, но затем не отвечает на рукопожатие SSL, наше приложение ожидает ответа неограниченное время.

Я использую IBM HACL (c ++) в JNI для доступа к серверу.

Как я могу проверить (в Java или C ++ под Windows XP) наличие SSL на стороне сервера? Могу ли я запустить рукопожатие вручную, получить первый ответ сервера, а затем закрыть сокет TCP? Или мне нужно завершить рукопожатие (и как мне?)

Спасибо.

Ответы [ 3 ]

2 голосов
/ 16 февраля 2010
try {
    SSLContext ctx = SSLContext.getDefault();
    ctx.getClientSessionContext().setSessionTimeout(5); // in seconds
    SSLSocket socket = (SSLSocket) 
         ctx.getSocketFactory().createSocket("host.com", 443);

    socket.setSoTimeout(5000); // in millis
    socket.startHandshake();
} catch (IOException ex) {
    sslAvailable = false;
}

Согласно вашему комментарию socket.setSoTimeout(5000) сделал свое дело.

Если это не сработает, тогда:

URLConnection urlConn = // obtain connection
urlConn.setConnectTimeout(5000); // in millis
2 голосов
/ 16 февраля 2010

В SSL первое отправляемое сообщение всегда выполняется клиентом: ClientHello. Сервер должен ответить сообщением ServerHello, так что это произойдет, когда вы узнаете, что он поддерживает SSL. Вы можете закрыть соединение (отправив предупреждение close_notify) на любую точку. Вам не нужно завершать рукопожатие .

Обычно одноранговые узлы обычно завершают промежуточное рукопожатие, если параметры сеанса не позволяют установить доверенный сеанс.

В Java класс SSLEngine дает вам необходимый контроль над рукопожатием SSL, но это довольно сложный конечный автомат, требующий глубокого знания SSL.

0 голосов
/ 16 февраля 2010

Проблема в том, что, когда сервер подключен к сети, принимает соединение через настроенный порт TCP, но затем не отвечает на SSL-рукопожатие, наше приложение ждет ответа бесконечно.

В качестве решения общего назначения, почему бы не поместить код подключения в поток и ожидать его, пока не истечет время ожидания.

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