当前位置: 首页 > 知识库问答 >
问题:

HTTP错误400无效的SNI-Jetty HTTPS servlet

洪育
2023-03-14

我正试图解决我的Jetty servlet在HTTPS上运行的一个问题。

它在浏览器中显示此错误页:

我所做的:

>

  • 我创建了我的Keystore和Truststore,如下所述:如何生成Keystore和Truststore

    这两个文件都放在我的项目的目录中,并编写了加载这些文件的代码。

    package sk.cood.metahost.server;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import org.eclipse.jetty.server.*;
    import org.eclipse.jetty.servlet.ServletContextHandler;
    import org.eclipse.jetty.servlet.ServletHolder;
    import org.eclipse.jetty.util.ssl.SslContextFactory;
    
    import java.io.*;
    
    @WebServlet(displayName = "MetaHostServlet", urlPatterns = { "/*" })
    public class MetaHostServlet extends HttpServlet {
        private static File keyStoreFile;
        private static File trustStoreFile;
    
        public static void main(String[] args) throws Exception {
            loadKeyStores();
    
            Server server = new Server(8080);
            ServerConnector connector = createSSLConnector(server, "password", "password", false);
            server.addConnector(connector);
    
            ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
            context.addServlet(new ServletHolder(new MetaHostServlet()),"/*");
            context.setContextPath("/");
            server.setHandler(context);
    
            server.start();
            server.join();
        }
    
        private static void loadKeyStores() {
            keyStoreFile = new File("keystore.jks");
            trustStoreFile = new File("truststore.jks");
            if (!keyStoreFile.exists()) {
                throw new RuntimeException("Key store file does not exist on path '"+keyStoreFile.getAbsolutePath()+"'");
            }
            if (!trustStoreFile.exists()) {
                throw new RuntimeException("Trust store file does not exist on path '"+trustStoreFile.getAbsolutePath()+"'");
            }
        }
    
        private static ServerConnector createSSLConnector(Server server, String keyStorePassword, String trustStorePassword, boolean isClientAuthNeeded) {
            SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
            sslContextFactory.setKeyStorePath(keyStoreFile.getAbsolutePath());
            sslContextFactory.setKeyStorePassword(keyStorePassword);
            sslContextFactory.setTrustStorePath(trustStoreFile.getAbsolutePath());
            sslContextFactory.setTrustStorePassword(trustStorePassword);
            sslContextFactory.setNeedClientAuth(isClientAuthNeeded);
    
            HttpConfiguration https_config = new HttpConfiguration();
            https_config.setSendServerVersion(false);
            https_config.setRequestHeaderSize(512 * 1024);
            https_config.setResponseHeaderSize(512 * 1024);
    
            SecureRequestCustomizer src = new SecureRequestCustomizer();
            https_config.addCustomizer(src);
    
            return new ServerConnector(server, sslContextFactory, new HttpConnectionFactory(https_config));
        }
    
        @Override
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
            res.setContentType("text/html");
            res.setStatus(HttpServletResponse.SC_OK);
            res.getWriter().println("<h1>Hello World!</h1>");
            res.getWriter().println("session=" + req.getSession(true).getId());
        }
    }
    

    然后,我尝试通过其他指南创建其他密钥库和信任库,例如,我将DNS替代名称添加到我的新密钥库中,如下所述:https://serverfault.com/questions/488003/keytool-subjectalternativename,但没有任何帮助。

    我不知道我的情况出了什么问题,也许有更有经验的人和证书会有所帮助。

    太感谢你们了!

  • 共有1个答案

    钱澄邈
    2023-03-14

    此消息意味着HTTP客户端的TLS层提供的SNI与密钥存储中的SNI主机不匹配。

    知道SNI本身有限制:

    • localhost
    • 不允许
    • IP地址文本不允许(例如:192.168.1.215FE80::3831:400C:DC07:7C40)
    • 所有SNI主机名必须至少包含1个.(因此不要使用简写主机/域名,而是使用完全限定的规范主机/域名)

    根据您的Java版本,这些SNI限制在Java网络堆栈中比在其他版本的Java中更早被检查。(Java11在主机名限制中使用.的限制较少,而Java17+则强制使用)

     类似资料:
    • 问题内容: 我有一段这样的代码 当我输入的查询超过一个词,例如“狗”时,出现以下错误。 谁能指出我做错了什么?提前致谢。 问题答案: “狗”返回400错误的原因是因为您没有转义URL的字符串。 如果您这样做: 会的。 但是,我强烈建议您使用请求,而不要使用urllib / urllib2 / httplib。这要容易得多,它将为您处理所有这一切。 这是与python请求相同的代码:

    • 问题内容: 我在Azure中托管了一个非常简单的.NET Web API,它有两种非常简单的方法: 我创建了一个简单的插件来调用这些方法。在我的AngularJS代码中,我进行了两个非常简单的$ http调用。GET工作正常。但是,POST始终返回“ 400(错误请求)”,然后在WebStorm控制台中不久显示“ XMLHttpRequestion无法加载…无效的HTTP状态代码400”。 任何和

    • 现在尝试解决Firebase实时数据库功能上的问题5个小时,请访问“Firebase部署”: 直到今天才有这个 功能是: 终端显示: 云功能日志显示: {"@type":"type.googleapis.com/google.cloud.audit.AuditLog"、"状态":{"code": 3、"消息":"INVALID_ARGUMENT"}、"验证信息":{"主体电子邮件":"nicoar

    • 当然,我的firebase存储中已经有一个名为的文件夹。那么究竟为什么第二个桶会没有定义呢?

    • 我试图自动化Web服务,并以字符串的形式传递XML,然后将其转换为字符串实体并设置实体。但我不知道为什么会抛出400错误。我是WebServices Automation的新手,请在这方面帮助我。 以下是我的代码:

    • 我正在WordPress中创建一个插件,我试图让谷歌工作表脚本工作,但我找不到方法。 我尝试了这里所有可用的代码和不同的源代码,但我找不到任何可以让它工作的东西。这是我得到的错误: 在浏览器中打开以下链接:https://accounts.google.com/o/oauth2/auth?response_type=code