【发布时间】:2018-09-29 05:34:41
【问题描述】:
我正在运行启用了 https/TLS 的嵌入式 Jetty 服务器。它适用于所有现代浏览器 (TLSv1.2)。
我们有一个旧版浏览器(无法更改/检查其代码的 .exe),我们正在尝试通过 https 连接到 Jetty 服务器,但失败了。
我在 jetty 端调试了 SSL,发现这个浏览器是使用 TLSv1 连接的,所以我做了以下操作:
sslContextFactory.setIncludeProtocols( "TLSv1");
在此之后,我开始在服务器端收到错误“没有共同的密码套装”。为了通过这个(我知道这是危险的,但现在仍然如此),我做到了:
sslContextFactory.setExcludeCipherSuites();
执行此操作后,我在服务器端看不到任何错误,但旧版浏览器仍然无法连接。 (它可以连接到其他 https 网站,虽然是 facebook、google)。
上述更改后的服务器端日志:
WRITE: TLSv1 Handshake, length = 48
called closeOutbound()
closeOutboundInternal()
SEND TLSv1 ALERT:
warning,
close_notify
WRITE: TLSv1 Alert, length = 32
知道这里有什么问题吗?我试图对它进行大量谷歌搜索,但无法完成。我也尝试在服务器上启用 SNI,但没有成功。
任何帮助将不胜感激。
谢谢
编辑1:
如果我将 Jetty SSL 日志与工作请求进行比较,我会看到以下差异。工作请求正在发送应用程序数据,如下所示:
WRITE: TLSv1 Application Data, length = 1285
在非工作请求中,我看到下面的附加行(TLS_RSA_WITH_AES_128_CBC_SHA 是密码套件名称):
Cached server session: [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA]
【问题讨论】:
-
您使用的 Java VM 的确切版本是什么?如今,许多 Java 实现在 JVM 级别禁用了 TLSv1。
-
我使用的是 jdk 1.8.0_161。设置 sslContextFactory.setIncludeProtocols("TLSv1") 不会启用它?
-
如果您谈论的是 Oracle OpenJDK 1.8.0_161,那么该版本包括 JCE Unlimited Strength Cipher Suites(实际上是第一个正确执行此操作的 OpenJDK 更新),并且已禁用易受攻击的密码套件 SHA/SHA1/MD5 和 RSA,以及通过 SSLv3 协议禁用 SSL。您是否尝试过使用具有严格 tls1 协议行为的 openssl s_client 连接到已配置的 Jetty 服务器?
-
我使用的是 Java(TM) SE 运行时环境(build 1.8.0_161-b12),而不是 openjdk。我还尝试使用带有 SSLContext =TLSv1 的 Java HttpsUrlConnection 进行连接,结果成功了。
-
仔细看看你的“旧版浏览器”,它的 TLS/1.0 可能是一个有很多怪癖的早期实现。我的个人测试是使用
openssl s_client -tls1,如果它在那里工作,那么你知道你在码头端有一个合适的 TLS/1.0。您可能最终不得不恢复您的操作系统/JVM 和 Jetty 以获得对该旧版浏览器的支持。顺便说一句,如果可以的话,请在您的问题中说明“旧版浏览器”的详细信息。
标签: java ssl embedded-jetty