我们的应用程序使用 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/