Java 如何在Netty中处理SSL加密警报
我已经用SslHandler创建了服务器(10.32.240.50)。客户端(10.32.240.5)连接到服务器,一切正常。一段时间后,客户端无缘无故断开连接。我已经获取了tcp转储,并在断开连接之前看到了加密警报:Java 如何在Netty中处理SSL加密警报,java,ssl,netty,Java,Ssl,Netty,我已经用SslHandler创建了服务器(10.32.240.50)。客户端(10.32.240.5)连接到服务器,一切正常。一段时间后,客户端无缘无故断开连接。我已经获取了tcp转储,并在断开连接之前看到了加密警报: 我不知道此警报中的客户端发送给我的是什么-它是加密的。此警报的原因可能是什么?为什么会导致断开连接?有没有办法用netty追踪这些事件?在这个阶段,很难看出您的问题是否真的与编程有关,因此这里是否有本体论 TLS 1.2警报可以包括很多内容,请参见以下内容: 当然,它是加密的
我不知道此警报中的客户端发送给我的是什么-它是加密的。此警报的原因可能是什么?为什么会导致断开连接?有没有办法用netty追踪这些事件?在这个阶段,很难看出您的问题是否真的与编程有关,因此这里是否有本体论 TLS 1.2警报可以包括很多内容,请参见以下内容: 当然,它是加密的,因此如果您真的想看到它,您需要:
FIN
在TCP级别关闭连接。因此,你的观察链是可以预期的。剩下的唯一原因是关于初始警报
澄清后,由于第一个警报来自.5
,它是客户端而不是服务器,这意味着您不控制的客户端已决定关闭TLS流,原因只有它自己知道
(如果我们仍然正确地猜测警报是“close_notify”,这仍然只是一个猜测,只有在您按照上述说明解密exchange时才能测试,或者可能会增加服务器的详细程度,就像@dave_thompson_085在评论中给出的想法:“如果您设置sysprop javax.net.debug=ssl,它将跟踪所有JSSE(ssl/TLS)操作,包括收到的警报。”)
除此之外,除了询问客户操作员/开发人员之外,我看不出有任何方法可以理解客户为什么决定不再与您交谈。这还取决于所交换的底层应用程序数据,可能传输已经结束,客户端不再需要TLS流了?遗憾的是,我无法控制客户端。我只是在服务器端看到disconnect,我必须猜测发生了什么。也许是“关闭通知”,一切都很好,但我想确定一下。另一个问题是我不知道如何重现此警报。请尝试使用另一个客户端(从
openssl s_client
开始),看看是否可以重现此警报。如果您控制服务器,在服务器生成此TLS警报时,您可能更幸运地更改它以提供更多数据,因此它应该有原因,但这可能隐藏在您使用的TLS库中很远的地方,或者如果TLS在那里终止,甚至可能隐藏在它前面的某个负载平衡器中。s_client
到达输入末尾(如果在Unix上通常是^D或在Windows上通常是^Z)或被赋予大写-Q命令(在一行上)将发送close_notify,然后是“physical”close(TCP FIN)。握手完成后,没有简单的方法让它发送任何其他警报。@dave_thompson_085该警报是由服务器发送的。openssl s_client
只是在服务器发送此警报时尝试复制,这完全取决于TLS流中交换的流量类型。哼哼,不确定OP在哪里警报从现在开始…如果设置syspropjavax.net.debug=ssl
它将跟踪所有JSSE(ssl/TLS)操作,其中包括收到的警报。在第二次读取时,我现在不清楚是谁将警报发送给谁。是.5
客户端还是服务器?它是第一方发送警报,然后另一方也发送警报,这是正常的。然后javax.net.debug
包括发送和接收的警报。But如果是应用程序级别(netty)决定关闭,JSSE没有说明原因——通常也不知道,尽管您可以设置一个断点并查看调用堆栈,这可能会有所帮助。很抱歉,我没有提到。5是一个客户端。50是一个服务器客户端发送警报,服务器用警报响应。在服务器发送FIN
之后。但这看起来更像是一个结果此警报的安全性。
enum { warning(1), fatal(2), (255) } AlertLevel;
enum {
close_notify(0),
unexpected_message(10),
bad_record_mac(20),
decryption_failed_RESERVED(21),
record_overflow(22),
decompression_failure(30),
handshake_failure(40),
no_certificate_RESERVED(41),
bad_certificate(42),
unsupported_certificate(43),
certificate_revoked(44),
certificate_expired(45),
certificate_unknown(46),
illegal_parameter(47),
unknown_ca(48),
access_denied(49),
decode_error(50),
decrypt_error(51),
export_restriction_RESERVED(60),
protocol_version(70),
insufficient_security(71),
internal_error(80),
user_canceled(90),
no_renegotiation(100),
unsupported_extension(110),
(255)
} AlertDescription;
struct {
AlertLevel level;
AlertDescription description;
} Alert;