You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty 11.0.11 SNI大小写敏感及空值异常问题技术求助

嵌入式Jetty 11.0.11 HTTPS请求间歇性SNI错误排查与问题咨询

我们的产品采用嵌入式Jetty(版本11.0.11)搭建服务器,支持HTTP调用,多数客户启用HTTPS配置。近期有客户反馈HTTPS请求时而正常、时而触发Jetty抛出org.eclipse.jetty.http.BadMessageException: 400: Invalid SNI错误。

排查过程

  • 通过Wireshark抓包发现:TLS层发送的SNI有时为小写的server.xyz.abc.com(请求成功),有时为大写的SERVER.xyz.abc.com(请求失败)。
  • 最初证书的主题备用名称仅包含小写域名,让客户添加大写域名后重新部署,但问题仍间歇性出现,失败仍集中在SNI为大写的场景。
  • 启用Jetty调试日志后发现,SecureRequestCustomizer.java中的sniHost值为null,触发异常,相关代码如下:
protected void checkSni(Request request, SSLSession session)
{
    if (isSniRequired() || isSniHostCheck())
    {
        String sniHost = (String)session.getValue(SslContextFactory.Server.SNI_HOST);

        X509 x509 = getX509(session);
        if (x509 == null)
            throw new BadMessageException(400, "Invalid SNI");
        String serverName = Request.getServerName(request);
        if (LOG.isDebugEnabled())
            LOG.debug("Host={}, SNI={}, SNI Certificate={}", serverName, sniHost, x509);

        if (isSniRequired() && (sniHost == null || !x509.matches(sniHost)))
            throw new BadMessageException(400, "Invalid SNI");

        if (isSniHostCheck() && !x509.matches(serverName))
            throw new BadMessageException(400, "Invalid SNI");
    }
}

问题咨询

  1. Jetty是否存在SNI大小写敏感的已知问题?为证书添加大写域名是否正确?
  2. TLS层为何交替发送大小写SNI?是否有配置可强制统一为小写?
  3. 若需禁用SNI检查,是否仅能通过代码修改实现?Jetty是否无相关配置参数?

问题解答

  1. 关于Jetty SNI大小写敏感与证书配置
    Jetty 11.0.11的SNI处理默认是大小写敏感的,这属于实现上的偏差——因为TLS规范明确SNI主机名不区分大小写。给证书添加大写域名的做法并非正确解决方案,只是临时的 workaround。问题根源在于Jetty在处理大写SNI时可能出现sniHost为null的异常,导致校验失败,即便证书包含大写域名也无法解决。

  2. TLS层交替发送大小写SNI的原因与统一配置
    SNI的大小写由客户端决定,不同客户端的处理逻辑不同:有些会自动将域名转为小写后发送,有些则保留用户输入的原始大小写,因此会出现交替发送的情况。Jetty无法强制客户端发送统一大小写的SNI,但可以在服务器端自定义处理:通过扩展SecureRequestCustomizer,在获取sniHost后将其转为小写,同时将证书中的域名也转为小写再进行匹配,实现大小写不敏感的校验。

  3. 禁用SNI检查的方式
    不需要修改核心代码,Jetty提供了现成的配置参数:

  • 代码配置(嵌入式场景):在初始化SslContextFactory.Server时,调用setSniRequired(false)和setSniHostCheck(false),关闭SNI强制要求与主机名检查。
  • 配置文件场景:在jetty.xml中添加以下配置:
    <Set name="sniRequired">false</Set>
    <Set name="sniHostCheck">false</Set>
    
    这两个参数默认值均为false,若你的代码中开启了这两个开关,关闭即可禁用SNI检查。

内容的提问来源于stack exchange,提问作者RBK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:43:22