【问题标题】:TLSv1 support in embedded Jetty server嵌入式 Jetty 服务器中的 TLSv1 支持
【发布时间】: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


【解决方案1】:

Jetty 9.4 存在问题。*
https://github.com/eclipse/jetty.project/issues/3773
https://github.com/eclipse/jetty.project/issues/2807
盲目排除 TLS1.0 和 TLS1.1。
修复
是 (a) 在如上所述构建 SslContextFactory 之后调用setExcludeCipherSuites()
或 (b) 只需覆盖 SslContextFactory.setExcludeCipherSuites(final String... cipherSuites) 什么都不做,如下所示:

final SslContextFactory sslContextFactory = new SslContextFactory()
    {
        @Override
        public void setExcludeCipherSuites(final String... cipherSuites)
        {
            // do nothing intentionally.
        }
    };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2020-05-18
    • 2012-04-21
    • 2022-08-18
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多