Jetty HTTPS服务报org.eclipse.jetty.http.BadMessageException:400 Invalid SNI如何解决
HTTPS协议Jetty Servlet服务浏览器访问异常
我在运行基于HTTPS的Jetty Servlet服务时遇到问题,浏览器访问服务时显示如下错误页面:
已执行操作
- 按照公开教程生成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()); } }
- 启动Jetty Servlet服务后尝试访问
localhost:8080,出现上述报错。
后续我重新生成了Keystore和Truststore,给新的Keystore添加了DNS备用名称,问题仍然没有解决。目前不清楚哪里配置出错,希望有Jetty和证书配置相关经验的开发者帮忙解决。
内容的提问来源于stack exchange,提问作者CooderSK
相关产品推荐
相关产品推荐

