当前位置: 首页 > 面试题库 >

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

羿季
2023-03-14
问题内容

有一个简单的套接字服务器监听端口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, ...)

注意,尽管如此,这还是很不寻常的。



 类似资料:
  • 我有一个看起来像这样的字符串,由普通字符和中间的一个转义Unicode字符组成: < code>reb\u016bke 我想让Python将整个字符串转换成普通的Unicode版本,应该是< code > reb ske 。我试过用< code>str.encode(),但是好像没怎么用,显然decode已经不存在了?我真的卡住了! 编辑:repr的输出是< code>reb\\\u016bke

  • 我想知道OpenCV是否能够将摄像头(dev/video1)设置为复合或S-video输入。 我使用的摄像头仅在复合输入中运行,但默认情况下,v4l2在S-Video输入中打开dev/video1。V4l2能够通过QT V4l2 utils应用程序从S视频转换为复合输入。 opencv正在使用v4l从相机捕获图像,我想在代码中使用OpenCV更改为复合输入。那有可能吗?如果不是,解决办法是什么?

  • 问题内容: 我创建SQL Server查询,并具有带有记录的普通表,另一方面具有带有记录的临时表,并且此表不为空,并且所有字段都没有任何要加入的冲突 是否可以加入这两个不同类型的表? 问题答案: 是否可以加入这两个不同类型的表?(正常和临时) 是的,可以联接不同类型的表(永久表和临时表)。连接这些表没有不同的语法。 例如 永久表: 临时表: 联接两个表: 看看这个SQLFiddle

  • 问题内容: 我是网络编程的新手。我有兴趣通过Java服务器和C客户端之间的套接字建立网络连接并保持连接无限打开的可能吗?我想保持连接打开状态以在客户端之间交换XML数据。 问题答案: 从理论上讲,可以无限期地打开服务器套接字;但是,使用客户端套接字是不可能的。主要原因是因为客户端套接字取决于处理数据的服务器端套接字,并且服务器套接字可能会关闭连接。 尽管可以无限期地保持连接打开,但实际情况通常会确

  • 问题内容: 是否可以“监视”指令上的ui更改?像这样的东西: 问题答案: 是。您可以使用,如果你在属性利用插值。 但是,如果这不是一个插值属性,并且您希望它可以从应用程序中的其他位置更改(绝对不建议这样做,请阅读Common Pitfalls ),那么函数可以返回: 无论如何,对您来说最好的方法可能是更改更改元素类的代码。它何时更改?

  • 我有以下信息: 我希望将权重和override_weight(可选字段)的类型更改为,因此我所做的是流动: 我的问题是,假设我有以前的protobuff消息编译器为旧消息编译的旧消息,我能将它们解析为新消息吗?文件对此非常模糊: “将可选字段移入或移出其中一个:消息序列化和分析后,您可能会丢失一些信息(某些字段将被清除)。但是,您可以安全地将单个字段移入新字段中,并且如果已知只设置了一个字段,则可