我正在运行启用了https / TLS的嵌入式Jetty服务器。它与所有现代浏览器(TLSv1.2)完美配合。
我们有一个旧版浏览器(无法更改/检查其代码的.exe),我们正尝试通过https将其连接到Jetty服务器,这是失败的。
我在码头调试了SSL,并得知该浏览器正在使用TLSv1进行连接,因此我执行了以下操作:
sslContextFactory.setIncludeProtocols( "TLSv1");
在此之后,我开始在服务器端收到错误消息“没有密码适合的地方”。要通过此操作(我知道这是危险动物,但目前仍然如此),我做到了:
sslContextFactory.setExcludeCipherSuites();
这样做之后,我在服务器端没有看到任何错误,但是旧版浏览器仍然无法连接。 (它可以以Facebook,Google身份连接到其他https网站)。
上述更改后的服务器端日志:
WRITE: TLSv1 Handshake, length = 48
called closeOutbound()
closeOutboundInternal()
SEND TLSv1 ALERT:
warning,
close_notify
WRITE: TLSv1 Alert, length = 32
任何想法在这里可能出什么问题吗?我尝试对其进行大量搜索,但无法完成。我也尝试在服务器上启用SNI,但是没有运气。
任何帮助将不胜感激。
谢谢
edit1 :
如果将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]
答案 0 :(得分:0)
Jetty 9.4出现问题。*
https://github.com/eclipse/jetty.project/issues/3773
https://github.com/eclipse/jetty.project/issues/2807
盲目地排除了TLS1.0和TLS1.1。
修复
如上所述构造SslContextFactory后,是(a)调用setExcludeCipherSuites()
,
或(b)仅覆盖SslContextFactory.setExcludeCipherSuites(final String... cipherSuites)
而不执行任何操作,如下所示:
final SslContextFactory sslContextFactory = new SslContextFactory()
{
@Override
public void setExcludeCipherSuites(final String... cipherSuites)
{
// do nothing intentionally.
}
};