Security 如何找到新连接的协商密码套件

Security 如何找到新连接的协商密码套件,security,jetty,embedded-jetty,Security,Jetty,Embedded Jetty,为了进一步提高基于Jetty 9.3/JRE8 build 45的嵌入式web服务器应用程序的安全性,我想将我的服务器限制为仅服务TLS 1.2(或未来的1.2和1.3)和以下密码套件: 0xC0,0x2B TLS_ECDHE_ECDSA_与_AES_128_GCM_SHA256 Y[RFC5289] 0xC0,0x2C TLS_ECDHE_ECDSA_与_AES_256_GCM_SHA384 Y[RFC5289] 但是,为了允许协商了后备密码套件的用户代理在Jetty将线程交给我的服务器的ha

为了进一步提高基于Jetty 9.3/JRE8 build 45的嵌入式web服务器应用程序的安全性,我想将我的服务器限制为仅服务TLS 1.2(或未来的1.2和1.3)和以下密码套件:

0xC0,0x2B TLS_ECDHE_ECDSA_与_AES_128_GCM_SHA256 Y[RFC5289]

0xC0,0x2C TLS_ECDHE_ECDSA_与_AES_256_GCM_SHA384 Y[RFC5289]

但是,为了允许协商了后备密码套件的用户代理在Jetty将线程交给我的服务器的handle()函数中结束,我需要允许一些其他密码套件通过,否则我无法发回一个简单的HTML页面,要求用户获得合适的浏览器

所有这些都已通过sslContextFactory对象正确设置,并且在我使用密码套件测试概念时运行良好,我支持TLS_ECDHE_RSA_with_AES_128_GCM_SHA256和TLS_ECDHE_RSA_with_AES_256_GCM_SHA384

我不知道为什么我的两个首选的上面还没有工作。一定是ECDSA问题,因为我的Goolge Chrome也有TLS_ECDHE_ECDSA_和_AES_128_GCM_SHA256作为首选套件,根据此网站:cc.dcsec.uni-hannover.de

然而,一旦在我的handle()方法中,我需要能够找出是否选择了上述密码组合中的一个,以便在没有选择的情况下,我可以通知用户,他需要一个支持TLS 1.2和椭圆曲线的浏览器,比如FireFox,或者与支持EC的操作系统结合使用,因为需要Chrome(例如Vista的Windows)等

我检查了HTTP/1.1 RFC,希望“连接”或“升级”HTTP标记会包含一些有用的内容。我还搜索了其他可以保存协商密码套件的HTTP头名称

然后,我研究了一些相关的RFC for HTTP over TLS,希望有一种方法可以要求一些头重写,以便在密码套件中包含一个标记。我还研究了servlet请求对象上是否有某种方法会公开密码套件,但最接近的方法是更通用的isSecure()或getScheme()(http/https)。我还列举了所有的头名称和相关的值,看看是否有什么

最后,我找到了一个来自Microsoft的链接,解释了如何从中提取这些信息,但后来我意识到,当Jetty调用我的handle()方法时,这些信息不再可用

我知道TCP/IP和TLS1.2在Jetty连接之前就已经处理好了。因此,密码套件可能不可用,就像不能从handle()方法内部提前阻止TCP/IP接受(没有连接/断开连接)

但也许有人知道一种获取密码套件的方法,或者可能会说这是不可能的,以此结束我的搜索

这里的一般理念是,我将只使用上述密码套件和HSTS+将所有HTTP重定向到HTTPS,为HTTPS TLS 1.2/HTTP 2.0提供服务,但我始终需要允许其他不需要的连接到达我的handle()方法,以发回一个基本HTML页面,请求浏览器升级。因此,在我的handle()中,我需要找出我在每个连接基础上处理的连接。密码套件是我需要的最后一种安宁

因此,如果我只接受上述两个密码套件,并使用sslContextFactory的setIncludeCipherSuits()关闭这扇门,那么是否有一种方法可以设置将发送回用户代理(HTML)的消息。然后,用户将看到该消息,而不是浏览器根据因缺少通用密码套件支持而导致的密码套件协商失败而显示的默认错误


非常感谢。

假设您使用的
ServerConnector
带有启用了
SecureRequestCustomizer
HttpConfiguration
,那么您可以执行此操作

String cipherSuite=request.getAttribute(“javax.servlet.request.cipher_套件”);

这将返回在已建立的安全连接上由使用的密码套件的名称。

假设您使用的
ServerConnector
带有启用了
SecureRequestCustomizer
HttpConfiguration
,则可以执行此操作

String cipherSuite=request.getAttribute(“javax.servlet.request.cipher_套件”);

这将返回在已建立的安全连接上由使用的密码套件的名称。

我确实按照您描述的方式使用ServerConnector。您的建议100%有效,谢谢。我确实按照您描述的方式使用ServerConnector。你的建议100%有效,谢谢。