一个简单的服务器
listen = getServer();
Logger.getAnonymousLogger().info("Listening to "+listen.toString());
SSLSocket client = (SSLSocket)listen.accept();
// adding this line fixes everything - client.write(42);
client.close();
和一个简单的客户
SocketFactory sockMaker = SSLSocketFactory.getDefault();
Socket server = sockMaker.createSocket("localhost", 1443);
int retval = server.getInputStream().read();
assert retval == -1;
server.close();
如果我不向SSL套接字写入任何内容,则客户端会引发异常:
Exception in thread "main" javax.net.ssl.SSLException:\
Received close_notify during handshake
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
我不知道为什么。SSL / TLS规范是否要求您将内容写入套接字?
请参阅完整示例。
您不必这样写任何东西,但是如果立即关闭它,它将生成close_notify
警报(尽管它被称为“警报”,但这是关闭TLS /
SSL套接字的常规方法的一部分)。
另外,SSL / TLS套接字被设计为“几乎”像普通的TCP套接字一样工作,但是由于SSL /
TLS的工作方式,有一些细节它们不能(也不能)。尤其是,在SSL / TLS连接开始时,会发生SSL /
TLS握手,这涉及在发送任何应用程序数据之前从每一方进行的多次读取/写入。
SSLSocket的文档说:
可以通过以下三种方式之一启动此连接上的初始握手:
startHandshake
明确开始握手的呼叫,或者- 尝试在此套接字上读取或写入应用程序数据会导致隐式握手,或者
getSession
如果没有当前有效的会话,则调用尝试建立会话,并且隐式握手已完成。
本质上,getInputStream().read()
您的示例中的客户端发起了握手,这导致服务器继续进行accept()
并在其一侧执行握手
。但是,由于您通常在服务器端将其关闭(通常是立即关闭),因此您甚至没有时间完成握手。因此,close_notify
在握手期间发送,这会导致您得到异常。如果您尝试从服务器端进行读取或写入,则握手至少已经完成。
编辑 :在@EJP的评论之后,我应该澄清一下我的意思:
createSocket("localhost", 1443)
客户端上的客户端建立连接,服务器通过接受连接accept()
。getInputStream().read()
在客户端使它发起握手。因此,它将ClientHello
TLS消息发送到服务器。close()
在接受套接字后立即使用,所以它会发送close_notify
警报。因为服务器尚未开始读取/写入,所以它尚未开始握手(因此无法完成握手)。需要注意的是目的ServerSocket.accept()
,这SSLServerSocket
工具,是创建一个SSLSocket
,不一定用它做任何事情。该SSLServerSocket
配置,但诉讼与握手的范围了。一方面,听起来像是使SSLSocket
行为像普通的TCP套接字一样更加透明。另一方面,它意味着从底层TCP流中读取数据,因此会产生副作用。我还没有尝试过,但是仍然可以将SSLSocket
by创建的SSLServerSocket
配置为
client socket 。毕竟,如RFC
2246词汇表所述:
“客户端:启动与服务器的TLS连接的应用程序实体。这可能或可能不意味着客户端启动了基础的传输连接。”
从API的角度来看,这绝对会影响透明度以及何时进行握手。
(编写用于SSL /
TLS套接字的API映射到普通TCP套接字的API是一项艰巨的工作,Java并不会为此做得太糟糕。真正的“乐趣”始于使用SSLEngine
和NIO通道的异步TLS
。考虑到任何一方都可以随时发起新的握手,甚至会变得更好:就TLS而言,以上级别的含义尚未定义,这可能会导致尴尬的问题。)
问题内容: 我想在Java中实现SSL代理。我基本上打开了两个套接字,并运行了两个线程,这些线程将写入他们从中读取的内容,反之亦然。每个线程如下所示: 每个线程只会关闭输入套接字,因此最终两个套接字都会关闭。 但是,如果我想使用an 怎么办?似乎那里不支持这些方法。这是我得到的例外。 我想出的是: 每当套接字结束时,我都必须捕获并忽略套接字末尾异常。 我的问题是: 如果不受支持,我怎么会从那里得到
本章讨论的是如何进入和退出CGDB。有如下几种方法: 在命令行下输入 'cgdb' 运行CGDB 在GDB窗口输入 'quit' 或者按下 'Ctrl+D' 退出CGDB 在源代码窗口输入 ':quit' 也可以退出CGDB。这在GDB挂起或者运行一条耗时很长的指令时也同样起作用
问题内容: 我在JPopupMenu中有一个JComboBox(以及其他组件)。事实证明,每当我打开组合框的弹出窗口(以选择一个项目)时,父级JPopupMenu都会关闭。我一直在尝试找到一种方法来覆盖此功能,但无济于事。 有没有人建议防止关闭父级JPopupMenu?谢谢! 问题答案: 这不可能直接实现,很难覆盖已知的错误,另一方面,Swing不允许同时使用两个lightwieght弹出组件 但
我复制了一个模板从coDepen。这段代码非常过时,有一些旧的cdn链接。这意味着我必须找到这些链接的更新版本。我是如此接近使应用程序完全功能,我需要打开后关闭模式。我相信这和自举有关。链接和模态代码如下。
上面代码的输出只是 但我希望有更详细的内容,包括模型参数,即: 我做错了什么?
问题内容: 这可能是一个愚蠢的问题,但是作为PHP的新手,我想知道在HTML模板代码中频繁打开和关闭PHP标签是否存在任何与性能相关的问题,如果是,那么最佳实践是什么?使用PHP标签? 我的问题不是关闭标签的重要性/正确性,或者不是哪种类型的代码比另一种更具可读性,而是关于文档的解析/执行方式及其对性能的影响。 为了说明,请考虑以下两个极端: 混合使用PHP和HTML标签: 分离PHP和HTML标