Можно ли заменить обычную розетку
в SSLSocket?
Да, это так. На стороне сервера работает следующее:
ServerSocketFactory ssf = ServerSocketFactory.getDefault();
ServerSocket serverSocket = ssf.createServerSocket(12345);
// I've initialised an sslContext with a keystore, as you normally would.
Socket socket = serverSocket.accept();
SSLSocketFactory sslSf = sslContext.getSocketFactory();
// The host name doesn't really matter, since we're turning it into a server socket
// (No need to match the host name to the certificate on this side).
SSLSocket sslSocket = (SSLSocket) sslSf.createSocket(socket, null,
socket.getPort(), false);
sslSocket.setUseClientMode(false);
// Use the sslSocket InputStream/OutputStream as usual.
SSLSocketFactory.createSocket(Socket, ...)
по умолчанию преобразует существующий Socket
в клиентский режим SSLSocket
. Так как рукопожатие начинается только тогда, когда вы начинаете чтение / запись с потоками ввода / вывода, еще есть время изменить режим с помощью setUseClientMode(false)
.
По остальной части вопроса:
Я хочу знать, что это
возможно, что:
- Если клиент отправляет запрос http, сервер обрабатывает запрос
непосредственно,
- Если клиент отправляет запрос https, клиент смены сервера
сокет к SSLSocket?
Опять да, это возможно. Иногда его называют « объединение портов », и он реализован в Grizzly и, таким образом, Glassfish .
Это работает, потому что и HTTP, и TLS (по которым работает HTTPS) являются протоколами, по которым клиент должен говорить первым. Следовательно, сервер может определить, является ли то, что клиент первоначально отправляет, сообщением TLS ClientHello
(в этом случае он должен попытаться продолжить квитирование TLS) или простым HTTP-запросом (например, GET / HTTP/1.1
...).
Я подозреваю, что объединение портов "проще" сделать с помощью SSLEngine
, в противном случае может быть сложно реализовать упреждающее чтение на обычном сокете, которое вы все равно сможете преобразовать с помощью SSLSocketFactory.createSocket(Socket, ...)
.
Обратите внимание, что это все же довольно необычно.