在不关闭底层套接字的情况下关闭SSL?

Cas*_*par 5 java sockets ssl

如何在不关闭底层套接字的情况下优雅地关闭Java SSL会话?

方案是Java客户端连接到(非Java)服务器,设置SSL并安全地将凭据(用户名和密码)发送到服务器.服务器设置在这些凭据下运行的环境,在此环境中生成一个新进程并将套接字句柄传递给它,但问题是这个新进程无法重用现有的SSL连接(并且无法使用SSL会话)恢复)...所以我们的想法是在生成新进程之前关闭SSL,然后使用新进程从头开始重新协商SSL会话.

问题是Java的SSLSocket close()方法除了关闭SSL会话之外还关闭套接字(通过发送close_notify警报).似乎没有相当于OpenSSL的SSL_shutdown()函数,它允许打开底层套接字.

我尝试了一些方法来解决这个问题:

  1. 第二次使用SSLSocket.startHandshake(),但是会自动尝试恢复现有的缓存SSL会话(由于生成的服务器进程不知道此会话而失败,并且,虽然有一种强制恢复SSL会话的方法)或者没有尝试,没有方法可以使所有缓存的会话无效或禁止使用缓存的会话.

  2. SSLSocket使用SSLSocketFactory.createSocket()创建现有套接字的顶部,并autoClose设置为false.这并不会阻止close()方法关闭底层套接字,我怀疑该autoClose参数只会阻止套接字在初始握手失败时被关闭.

  3. 创建SSLSocket现有套接字(如上所述),然后创建第二个SSLSocket用于与生成进程(来自新SSLContext)的SSL握手.这会失败,因为当服务器发送close_notify警报时(在生成子进程之前),Java会关闭套接字.

我听说过SSLEngine,但我也读过(尽管源代码目前没有我),用TCP/IP编写正确的SSL实现是一件非常痛苦的事情,当我需要的时候看起来有些过分.是有一个版本SSLSocket,其close()不叫super.Close().

但是,SSLSocket似乎甚至没有覆盖close()(根据javadoc),所以我不确定close()当它似乎没有任何支持注册关闭侦听器时它如何挂钩该方法Socket.

公司政策规定不能使用第三方加密库,因此我不能转向其他SSL实施,例如Bouncy Castle解决问题.

如果我们无法使当前的1插槽设计工作,另一种方法是重写客户端和服务器以使用2个独立的套接字(在必须反对拒绝服务和man-in-the-方面变得非常混乱)中间攻击,并不是SSL首先应该是什么?).

任何有关如何解决这个问题的意见或想法都会受到欢迎.

use*_*421 2

这不会阻止 close() 方法关闭底层套接字

是的,它确实。根据文档。

我怀疑 autoClose 参数只会阻止在初始握手失败时关闭套接字。

不会。它会阻止关闭底层套接字。根据文档。

向我们展示一些代码。