2010-02-16 3 views
1

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

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

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

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

Спасибо.

+0

hm, на самом деле, как насчет предоставления некоторого кода там. Потому что в нормальной среде соединение сразу падает. – Bozho

+0

Создайте серверный сокет и позвольте ему прослушивать порт, не отправляя ничего, затем попытайтесь подключиться к этому порту и запустите SSL-квитирование. Я попробовал это с netcat. –

+0

ECLConnList ConnList; ECLConnection * Conn = ConnList.GetFirstConnection(); Conn-> StartCommunication(); –

ответ

2
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 
+0

Умм, работает, но, похоже, делает то же самое, что я пытаюсь сделать: - Если хост не отвечает вообще, startHandshake() ждет навсегда. Я мог бы обернуть это в поток и закрыть сокет после заданного таймаута. - Если хост поддерживает SSL, я получаю сообщение javax.net.ssl.SSLHandshakeException: Удаленное соединение с узлом удаленного соединения во время рукопожатия Это может сработать, но я не знаю, правильно ли это решение. –

+0

@ G B см. Мое обновление о тайм-ауте. – Bozho

+0

Такая же проблема. Тайм-аут сеанса - это нечто иное. –

2

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

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

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

+0

Приятно знать, что есть решение, по крайней мере теоретически. Мне просто нужно выяснить, как реализовать это в Java. –

+0

Создайте SSLSocket и вызовите startHandshake() или отправьте некоторые данные. Если вы не делаете ни одной из этих вещей, рукопожатие не начинается. Установите тайм-аут сокета, а также просто убедитесь. – EJP

+1

@EJP: Приятно видеть вас здесь. Мне понравилась ваша сетевая книга.:) –

0

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

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

+0

Да, мы сделали: соединение зависает и не может быть закрыто. Проблема в IBM Host Access Library. –

+0

Как решение общего назначения, почему бы не просто использовать тайм-аут чтения? – EJP

Смежные вопросы