如何按需启用javax.net.debug

时间:2017-11-27 05:55:19

标签: java apache debugging ssl httpclient

我们的应用程序使用Apache HttpClient 4.5.3,我们观察到一个非常奇怪的行为,我们的客户端和服务器之间使用SNI功能进行通信

如果SSL请求带有来自客户端的服务器名称(即:服务器的主机名),则服务器配置为返回Go Daddy签名证书,并且它将返回所有其他的自签名证书域名

观察行为

  • 客户端在除我们的生产计算机之外的所有服务器上都会收到正确的服务器证书
  • 客户端代码在tomcat 8上部署的应用程序中运行,我们注意到对端点的初始请求成功完成。运行一段时间后,我们会在客户端上收到SSL异常。
  • 错误是因为服务器未发送正确的证书(它发送默认的自签名证书)
  • 如果我们重新启动部署了客户端的tomcat服务器,则呼叫将再次成功通过。

我们过去曾使用javax.net.debug进行调试,但在这种情况下我们无法使用它,因为我们需要重新启动tomcat服务器以实现其效果,当我们重新启动tomcat服务器时,调用端点服务器开始成功。 此外,javax.net.debug记录了大量信息,这些信息将充斥我们的​​日志,因此我们希望它仅针对特定请求启用。 我们希望只记录Client Hello(包含传递给端点的server_name)

我已经通读了 https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#OwnX509ETM 但不确定我们可以使用什么来仅打印下推到服务器的SSL服务器名称指示器。

1 个答案:

答案 0 :(得分:0)

我和你一样关心,然后我首先考虑动态添加环境变量,但它始终采用旧的价值。然后我发现javax.net.debug环境变量仅在SSLSocketFactory.java中使用静态块读取一次。完整的源代码可用here

static {
     String s = java.security.AccessController.doPrivileged(
         new GetPropertyAction("javax.net.debug", "")).toLowerCase(Locale.ENGLISH);
     DEBUG = s.contains("all") || s.contains("ssl");
}