java - 如何按需启用 javax.net.debug

标签 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 服务器名称指示器。

最佳答案

我和你有同样的担忧,然后首先我在考虑动态添加环境变量,但它总是取旧值。然后我发现 javax.net.debug 环境变量只用 SSLSocketFactory.java 中的静态 block 读取一次。完整的源代码可用here .

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

关于java - 如何按需启用 javax.net.debug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47504726/

相关文章:

java - 将 MySQL 服务器安装程序与 Java 项目捆绑在一起

apache - 基于服务器名称/路径的 htaccess 条件语句

java - Apache Httpd 和 Eclipse Tomcat 之间的连接(Windows 7)

apache - Centos 7 phpmyadmin 403 禁止

debugging - OllyDbg 和 WinDbg 有什么区别?

java - ChromeDriver 不与 OS X 上的浏览​​器通信

java - Maven Jetty 插件 - Servlet 不工作

MPI 程序的调试和测试

java - hbase根据id的部分删除记录

python - PDB 中的自动完成和制表键