我们的应用程序使用 Apache HttpClient 4.5.3,我们观察到客户端和服务器之间使用 SNI 功能进行通信的非常奇怪的行为
服务器配置为如果 SSL 请求带有我们客户端期望的服务器名称(即:服务器的主机名),则返回 GoDaddy 签名证书,并且它将返回所有其他域名的自签名证书
观察到的行为
- 客户端在除我们的生产机器上之外的所有服务器上收到正确的服务器证书
- 客户端代码正在 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 https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#OwnX509ETM但不确定我们可以使用什么来仅打印推送到服务器的 SSL 服务器名称指示符。
我和你有同样的担忧,然后首先我正在考虑动态添加环境变量,但它总是采用旧值。然后我发现javax.net.debug
环境变量仅在静态块中读取一次SSLSocketFactory.java
。完整的源代码可用here http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/javax/net/ssl/SSLSocketFactory.java/.
static {
String s = java.security.AccessController.doPrivileged(
new GetPropertyAction("javax.net.debug", "")).toLowerCase(Locale.ENGLISH);
DEBUG = s.contains("all") || s.contains("ssl");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)