Java 如何在Netty中处理SSL加密警报

Java 如何在Netty中处理SSL加密警报,java,ssl,netty,Java,Ssl,Netty,我已经用SslHandler创建了服务器(10.32.240.50)。客户端(10.32.240.5)连接到服务器,一切正常。一段时间后,客户端无缘无故断开连接。我已经获取了tcp转储,并在断开连接之前看到了加密警报: 我不知道此警报中的客户端发送给我的是什么-它是加密的。此警报的原因可能是什么?为什么会导致断开连接?有没有办法用netty追踪这些事件?在这个阶段,很难看出您的问题是否真的与编程有关,因此这里是否有本体论 TLS 1.2警报可以包括很多内容,请参见以下内容: 当然,它是加密的

我已经用SslHandler创建了服务器(10.32.240.50)。客户端(10.32.240.5)连接到服务器,一切正常。一段时间后,客户端无缘无故断开连接。我已经获取了tcp转储,并在断开连接之前看到了加密警报:


我不知道此警报中的客户端发送给我的是什么-它是加密的。此警报的原因可能是什么?为什么会导致断开连接?有没有办法用netty追踪这些事件?

在这个阶段,很难看出您的问题是否真的与编程有关,因此这里是否有本体论

TLS 1.2警报可以包括很多内容,请参见以下内容:

当然,它是加密的,因此如果您真的想看到它,您需要:

  • 更改客户端,使其在进行触发此错误的连接时输出主机密和客户端随机
  • 记录与wireshark的相关连接
  • 然后,您将能够在wireshark内部,使用第一点中的项目对其进行解密(您可以找到许多关于如何进行解密的教程)
  • 根据经验,如果警报发生在某些应用程序数据之后,最可能的情况是“关闭通知”。这是一种“正常”情况,它只是意味着服务器决定关闭TLS套接字(但不一定是TCP套接字),并因此向另一方发出警告(警报)

    如果是这种情况,则期望另一方发送相同的警报,然后使用
    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在哪里警报从现在开始…如果设置sysprop
    javax.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;