Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅在Tomcat 8+;用Java_Java_Security_Tomcat_Ssl - Fatal编程技术网

仅在Tomcat 8+;用Java

仅在Tomcat 8+;用Java,java,security,tomcat,ssl,Java,Security,Tomcat,Ssl,当REST客户端尝试连接到我的应用程序时,如果SSL握手失败,我需要记录。该应用程序是使用SpringBoot和Java8构建的,并部署在Tomcat8上 在SSL握手失败的场景中,由于TLS连接断开,日志记录要求可能必须在Tomcat层或Java中完成,因为在我的例子中,Tomcat使用底层JVM进行SSL证书验证 我知道启用调试级别日志记录 -Djavax.net.debug=ssl 但这会记录大量信息,并会减慢进程。并记录成功的SSL验证。是否有一种方法可以在Java或Tomcat级别

当REST客户端尝试连接到我的应用程序时,如果SSL握手失败,我需要记录。该应用程序是使用SpringBoot和Java8构建的,并部署在Tomcat8上

在SSL握手失败的场景中,由于TLS连接断开,日志记录要求可能必须在Tomcat层或Java中完成,因为在我的例子中,Tomcat使用底层JVM进行SSL证书验证


我知道启用调试级别日志记录

-Djavax.net.debug=ssl

但这会记录大量信息,并会减慢进程。并记录成功的SSL验证。是否有一种方法可以在Java或Tomcat级别单独启用故障案例,并使用最少的日志

我不是从调试的角度来看这一点,因为SSL调试日志在这方面非常好。
这一要求更多的是出于日志记录和审核的目的,启用调试日志不是一个可行的选择。一种只记录发生在SSL上的错误而不记录所有十六进制/证书数据的机制。

不幸的是,这不太可能。而且它与Tomcat没有关系。 SSL日志记录它不是应用程序中标准日志记录的一部分。 您可以尝试使用以下选项减少输出:

-Djava.net.debug=handshake
其他一些:

  • 记录-打印每个SSL记录的跟踪(在SSL协议级别)
  • 握手-在收到每个握手消息时打印它
  • keygen-打印密钥交换的密钥生成数据
  • 会话-打印SSL会话活动
  • defaultctx-打印默认SSL初始化信息
  • sslctx-打印有关SSL上下文的信息
  • sessioncache—打印有关SSL会话缓存的信息
  • keymanager-打印有关调用密钥管理器的信息
  • trustmanager-打印有关调用信任管理器的信息
  • 数据-对于握手跟踪,打印出每条消息的十六进制转储
  • 详细-对于握手跟踪,打印详细信息
  • 纯文本-对于记录跟踪,打印记录的十六进制转储

如果您确实需要它,并且性能对您的应用程序至关重要,您可以使用//等插入(在您可以阅读的有关握手过程的文档中)并检查其中的握手状态。但是在这种情况下,您将没有调试信息——只有true/false


有关所有可用设置,请参见。在这里,您可以看到有一个类,它在Tomcat中使用。它是JSSE的包装器。

我多次遇到相同的问题,我按照以下方式破解了它。我在intelliJ中设置了我的项目

  • 设置VM选项的调试级别:-Djavax.net.Debug=all(编辑配置->VM选项)保存并应用
  • 在调试模式下运行项目(应用程序),并检查服务器和客户端之间的调用。例如,您会发现控制台中会有从服务器到客户端的额外CertificateRequest调用,如下所示
  • ***证书申请 证书类型:RSA、DSS、ECDSA 支持的签名算法:SHA512 WithRSA,Unknown(散列:0x6,签名:0x2),SHA512 WithECDSA,SH384WithRSA,Unknown(散列:0x5,签名:0x2),SHA384 WithECDSA,SHA256 WithRSA,Unknown(散列:0x3,签名:0x2),SHA224 WithECDSA,SHA1 WithRSA,SHA1 WithDSA,SHA1 WithECDSA 核证机关:

    CN=赛门铁克公共三级,O=赛门铁克公司,C=美国

    CN=Symantec Class 3 Manage,OU=Symantec Trusted Network,O=Symantec,C=US

    [读取]MD5和SHA1哈希:len=302

  • 若您可以看到上面带有“CN”的证书请求,则表示您在cacert密钥库中丢失了这些证书 解决方案:添加缺少的证书(对于我们的示例,两个证书CN=Symantec公共类3和CN=Symantec类3)

    我们必须了解服务器和客户端之间通过SSL协议进行的调用,请查看以下链接以获取服务器和客户端如何通信的更多信息

    我会给youtube视频演示,如果有人有问题

    我希望这个解决方案能帮助别人


    谢谢。

    当握手(明文)失败时,通常您只需在主机上或连接到镜像端口的计算机上使用Wireshark即可找出问题所在。将筛选器设置为仅记录有问题的REST客户端的IP流量。之后,向对SSL/TLS略知一二的人展示录制的握手,或者自学……@Robert,我想你弄错了我的问题。我知道使用wireshark和分析SSL调试日志可以从调试感知中识别问题。但我的要求不同。我正在寻找一种方法,如何记录ssl握手失败。不是从调试感知,而是从日志和审计感知,以了解尝试与应用程序进行SSL握手的失败次数,因此您的主要目标是收集TLD连接的统计数据-有多少失败,有多少工作(可能是TLS版本和密码套件客户端和服务器约定的). 这就是你想要实现的,对吗?是的,罗伯特。我主要希望只记录SSL握手失败。tomcat似乎没有提供任何定制或添加侦听器来记录握手错误的方法。但是,您可以尝试将记录器“org.apache.tomcat.util.net.NioEndpoint”的日志记录级别设置为“DEBUG”,并确保它具有在调试级别记录事件的appender。在日志中,您应该看到“SSL握手期间出错”。请参阅是否可以启用tomcat用于ssl握手检查的底层java类的日志记录?tomcat使用连接器。Nio连接器使用我提到的JSSE。