【发布时间】:2016-03-31 03:39:37
【问题描述】:
我有一个 Apache Web 服务器,它运行多个具有不同证书和 SNI 的 TLS 虚拟主机。
我可以使用 curl 访问各种虚拟主机(大概是 SNI 使其工作)。我还可以使用一个基本上只是在 URL 上打开连接()的小命令行 Java 程序来访问它们。
在我的 Tomcat 应用程序中,基本相同的客户端代码访问与客户端相同的 Apache 服务器,但始终以默认证书 (defaulthost.defaultdomain) 结束,而不是在它尝试访问的 URL。 (这会产生一个 SunCertPathBuilderException - 基本上它无法验证证书的证书路径,这当然是正确的,因为它是一个非官方证书。但是无论如何都不应该使用默认证书。)
就好像 SNI 在我的应用程序/Tomcat 中已在客户端停用。我不知道为什么我的应用程序和命令行之间的行为应该不同;相同的JDK,相同的主机等。
我找到了属性jsse.enableSNIExtension,但我验证了这两种情况都设置为true。问题:
任何想法,甚至是疯狂的想法,为什么这两个程序的行为不同?
有什么想法可以调试吗?
这是 86_64、JDK 8u77、Tomcat 8.0.32 上的 Arch Linux。
【问题讨论】:
-
您能否尝试捕获网络跟踪以查看应用程序是否在您的 tomcat 中发送 SNI 指示?你发出 https 请求的代码是什么?
-
SNI 不会神奇地添加到 SSL 连接,但负责建立 SSL 连接的代码必须使用它。并非所有 HTTP 库都这样做。我的猜测是,您在 tomcat 中使用不同的库或代码进行 URL 访问,而不是在您的小型测试程序中,因此 SNI 在一种情况下被使用,但在另一种情况下不使用。
-
您可以启用 Java 对 SSL 消息的调试,例如在命令行中使用
-Djavax.net.debug=ssl,然后查看 Java 客户端发送/接收的具体内容... -
@Castaglia:使用调试标志报告 Tomcat 应用程序(与命令行应用程序不同)不报告
Extension server_name, server_name: [type=host_name (0), value=example.com]。