Как сократить время ожидания ssl-рукопожатия?

У меня есть следующий код из http://sanjaal.com/java/tag/get-public-key-of-ssl-certificate-in-java/, который создает сокет и инициирует рукопожатие ssl.

SSLSocketFactory factory = HttpsURLConnection
.getDefaultSSLSocketFactory();

System.out.println("Creating a SSL Socket For "+hostname+" on port "+port);

SSLSocket socket = (SSLSocket) factory.createSocket(hostname, port);

socket.startHandshake();
System.out.println("Handshaking Complete");

Проблема в том, что если рукопожатие не удалось установить, проходит долгое время ожидания, прежде чем я увижу исключение: Время ожидания соединения истекло.

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


person Jury A    schedule 18.07.2012    source источник
comment
В любом случае вы должны делать это в потоке, поэтому вам не нужно ждать рукопожатия. SSLSocket предоставляет метод addHandshakeCompletedListener.   -  person Falmarri    schedule 19.07.2012
comment
возможный дубликат время ожидания соединения SSL и время ожидания чтения   -  person    schedule 19.07.2012
comment
Как насчет метода сокета setSoTimeout()?   -  person peshkira    schedule 19.07.2012


Ответы (2)


«Тайм-аут соединения» не имеет ничего общего с рукопожатием или даже с SSL. Этого не происходит, когда вы вызываете startHandshake(): это происходит, когда вы создаете сокет. Ваша трассировка стека сказала бы вам об этом.

Чтобы уменьшить его, создайте Socket() с помощью конструктора по умолчанию; call connect (адрес SocketAddress, долгое время ожидания); затем, если это удастся, вызовите SSLSocketFactory.createSocket(Socket,...), чтобы обернуть его в SSLSocket.

Обратите внимание, что блог, который вы цитируете, действительно очень низкого качества. Некоторые проблемы с ним:

  1. SSL-сертификат не «включает шифрование». Он существует в первую очередь для аутентификации. Он также играет второстепенную, несущественную роль в рукопожатии, ведущем к сеансовому ключу.

  2. TLS предлагает гораздо больше, чем просто «предотвращение прослушивания, несанкционированного доступа и подделки сообщений». и он предлагает гораздо больше возможностей шифрования, чем просто RSA с ключами 1024 или 2048 байт.

  3. Предположение о том, что «на уровне браузера это означает только то, что браузер подтвердил сертификат сервера», и что в целях безопасности пользователь/приложение должны «зашифровать что-либо с помощью открытого ключа, содержащегося в сертификате, и гарантировать, что сервер может его понять». ' - полная ерунда. Браузер уже проверил, что сервер владеет этим сертификатом, с помощью механизма цифровой подписи во время рукопожатия SSL.

  4. Все это: «значок «запертого замка» не имеет никакого отношения к URL-адресу, DNS-имени или IP-адресу сервера — думать иначе — распространенное заблуждение. Такая привязка может быть надежно установлена ​​только в том случае, если URL-адрес, имя или адрес указаны в самом сертификате сервера. ' совершенно неверно. HTTPS включает проверку имени хоста по сравнению с тем, что встроено в сертификат: и то, что встроено в сертификат, помещается туда и проверяется подписывающим органом.

Не полагайтесь на такие сайты без рефералов и без отзывов. Используйте официальную документацию по продукту.

person user207421    schedule 18.07.2012
comment
@user207421 user207421 Как установить время ожидания, если мы создадим серверный сокет, как показано ниже? SSLServerSocket socket = (SSLServerSocket) factory.createServerSocket(port, 0, bindAddress); Если мы установим тайм-аут для серверного сокета как socket.setSoTimeout(timeout); , будет ли он работать и для рукопожатия? clientSocket = serverSocket.accept(); ((SSLSocket) clientSocket).startHandshake() - person RanPaul; 06.09.2019

Перед выполнением sslSocket.startHandshake(); используйте sslSocket.setSoTimeout (время ожидания);

setSoTimeout - это тайм-аут чтения, поэтому значение тайм-аута, которое вы указываете в setSoTimeout, также будет работать с рукопожатием.

person pritz    schedule 30.07.2014
comment
@EJP не имеет значения, для начального рукопожатия указанная опция тайм-аута действительно работает. socket.startHandshake() вызовет исключение (проверено jdk8) - person benez; 16.08.2017