是否可以将普通套接字更改为SSLSocket?
有一个简单的套接字服务器监听端口12345
;
ServerSocket s = new ServerSocket(12345);
我想知道的是,有可能:
- 如果客户端发送
http
请求,则服务器将直接处理该请求, - 如果客户端发送
https
请求,则服务器将客户端套接字更改为SSLSocket吗?
谢谢
回答:
是否可以将普通套接字更改为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
转换为client-mode
SSLSocket
。由于握手仅在您开始使用I /
O流进行读/写时才开始,因此仍然是使用更改模式的时候setUseClientMode(false)
。
关于其余的问题:
我想知道的是,有可能:
- 如果客户端发送http请求,则服务器将直接处理该请求,
- 如果客户端发送https请求,则服务器将客户端套接字更改为SSLSocket吗?
再一次,是的,有可能。它有时被称为“ 端口统一
”,并在Grizzly和Glassfish中实现。
之所以起作用,是因为HTTP和TLS(HTTPS可以在其上工作)都是希望客户端首先进行通信的协议。因此,服务器可以检测到客户端最初发送的ClientHello
消息是TLS
消息(在这种情况下,它应该尝试进行TLS握手)还是纯HTTP请求(例如GET / HTTP/1.1
…)。
我怀疑使用端口统一更容易SSLEngine
,否则,可能很难在纯套接字上实现预读,您仍然可以通过进行转换SSLSocketFactory.createSocket(Socket,
...)。
注意,尽管如此,这还是很不寻常的。
以上是 是否可以将普通套接字更改为SSLSocket? 的全部内容, 来源链接: utcz.com/qa/399435.html