У меня есть некоторые проблемы при приеме SSL-соединений с SSLServerSocket.
Если в приведенном ниже коде клиент подключается к порту ssl, но не отправляет байты (он только устанавливает соединение) икроме того, затем поддерживается соединение, код на стороне сервера зависает в методе sslServerSocket.accept (). Он зависает до тех пор, пока клиент не закроет соединение, тайм-аут не происходит.
Я попытался установить значение setSoTimeout для SSLServerSocket, но это влияет только на часть, когда accept () ожидает новых входящих соединений, ноне ситуация, когда соединение установлено и когда accept () согласовывает SSL-квитирование (например, когда accept () ожидает первые байты, которые клиент не отправил бы).
[...]
KeyManagerFactory kmf = KeyManagerFactory.getInstance (KeyManagerFactory.getDefaultAlgorithm ());
kmf.init (ks, keystorePassword.toCharArray ());
SSLContext sc = SSLContext.getInstance ("TLS");
sc.init (kmf.getKeyManagers (), null, null);
SSLServerSocketFactory sslServerSocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault ();
SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketfactory.createServerSocket (3505, 1);
sslServerSocket.setSoTimeout (3000);
Log.println ("waiting for accept ...");
SSLSocket client = null;
try
{
client = (SSLSocket) sslServerSocket.accept ();
}
catch (SocketTimeoutException e)
{
Log.println ("accept-timeout");
}
[...]
Когда указано вышекод выполняется, и никто не подключается, вы получаете Log-выход «accept-timeout» через 3000 миллисекунд, как установлено с помощью setSoTimeout (3000). Пока все в порядке.
Но если кто-то подключается в течение этого времени, а затем не отправляет байты, методы accept () блокируются навсегда или до тех пор, пока (вредоносный) клиент удерживает соединение.
Есть идеи, как можно установить время ожидания для согласования SSL-рукопожатия?
С уважением, Томас