仅在带有Java的Tomcat 8+上启用日志记录SSL握手失败(审计目的日志)

2022-09-03 02:25:04

如果 SSL 握手失败,而 REST 客户端尝试连接到我的应用程序,我需要记录。该应用程序是使用Spring Boot和Java 8构建的,并部署在Tomcat 8上。

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

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" scheme="https" secure="true" keystoreFile="keyStore-1.jks" keystorePass="password" keystoreType="jks" truststoreFile="TrustStore.jks" truststorePass="passwrd" truststoreType="jks" clientAuth="want" sslProtocol="TLSv1.2" />

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

-Djavax.net.debug=ssl

但这会记录大量信息,并会减慢该过程。并记录成功的 SSL 评估。有没有办法在Java或Tomcat级别使用最少的日志单独启用故障案例。

我不是从调试的角度来看待这个问题,因为SSL调试日志对此非常好。此要求更多地来自日志记录和审核目的,启用调试日志不是一个可行的选项。一种仅记录发生的 SSL 错误而不是所有十六进制/证书数据的机制。


答案 1

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

-Djava.net.debug=handshake

其他一些:

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

请参阅文档

如果你真的需要它,并且性能对你的应用程序至关重要,你可以使用ASM/Btrace /etc检测SSSLSocket(在文档中你可以阅读有关握手过程的内容),并检查其中的握手状态。但是在这种情况下,您将没有调试信息 - 只有真/假。

另请参阅具有所有可用设置的 Tomcat 文档。在那里,您可以读到有JSSE实现类,该类在Tomcat中使用。它是JSSE的包装器。


答案 2

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

  1. 设置 VM 选项的调试级别:-Djavax.net.debug=all(编辑配置->VM 选项)保存并应用。
  2. 在调试模式下运行项目(App),并检查服务器和客户端之间的调用。您会发现在控制台中,从服务器到客户端将有额外的CerterateRequest调用,例如。

CertificateRequest 证书类型: RSA, DSS, ECDSA 支持的签名算法: SHA512withRSA, Unknown (hash:0x6, signature:0x2), SHA512withECDSA, SHA384withRSA, Unknown (hash:0x5, signature:0x2), SHA384withECDSA, SHA256withRSA, Unknown (hash:0x4, signature:0x2), SHA256withECDSA, SHA224withRSA, Unknown (hash:0x3, signature:0x2), SHA224withECDSA, SHA1withRSA, SHA1withDSA, SHA1withECDSA, SHA1withECDSA 证书颁发机构:

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

CN=赛门铁克 3 级管理,OU=赛门铁克可信网络,O=赛门铁克,C=美国

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

  1. 如果您可以看到带有“CN”的证书请求,如上所述,则表示您在 cacert 密钥库中缺少这些证书。

解决方案:添加缺少的证书(对于我们的示例,两个证书 CN =赛门铁克公共 3 类和 CN=赛门铁克 3 类管理)。

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

https://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#InstallProbs

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

我希望这个解决方案可以帮助某人。

谢谢。