是否可以将普通套接字更改为SSLSocket?

有一个简单的套接字服务器监听端口12345;

ServerSocket s = new ServerSocket(12345);

我想知道的是,有可能:

  1. 如果客户端发送http请求,则服务器将直接处理该请求,
  2. 如果客户端发送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

回到顶部