HTTP ERROR 400 Invalid SNI - Jetty HTTPS servlet
Posted
技术标签:
【中文标题】HTTP ERROR 400 Invalid SNI - Jetty HTTPS servlet【英文标题】: 【发布时间】:2021-12-24 22:26:30 【问题描述】:我正在尝试解决通过 HTTPS 运行的 Jetty servlet 的问题。
它在浏览器中显示这个错误页面:
我做了什么:
我创建了我的密钥库和信任库,如下所述:How to generate keystore and 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 并出现提到的错误。
然后我尝试通过其他指南创建其他密钥库和信任库,例如,我向我的新密钥库添加了 DNS 替代名称,如下所述:https://serverfault.com/questions/488003/keytool-subjectalternativename 但没有任何帮助。
我不知道我的情况出了什么问题,也许在码头和证书方面更有经验的人会有所帮助。
非常感谢!
【问题讨论】:
【参考方案1】:此消息表示您的 HTTP 客户端的 TLS 层提供的 SNI 与您的密钥库中的 SNI 主机之一不匹配。
知道SNI本身有限制:
localhost
不允许
不允许使用 IP 地址文字(例如:192.168.1.215
或 fe80::3831:400c:dc07:7c40
)
所有 SNI 主机名的名称中必须至少包含 1 个.
(因此不要使用简写的主机/域名,使用完全限定的规范主机/域名)
这些限制在规范中,通常是您遇到的大多数问题的原因。
根据您的 Java 版本,这些 SNI 限制在 Java 网络堆栈中的检查速度会比其他 Java 版本更早。 (Java 11 在主机名限制中的 .
限制较少,而 Java 17+ 则强制它)
【讨论】:
它不再向我显示 Invalid SNI 错误,感谢您的帮助,但现在它在 SEC_E_INVALID_TOKEN (0x80090308) 上失败 - 当我尝试使用 curl 连接时,提供给函数的令牌无效,因为浏览器只告诉我“此站点无法提供安全连接,ERR_SSL_PROTOCOL_ERROR”。 我创建了下一个问题***.com/questions/69954338/…以上是关于HTTP ERROR 400 Invalid SNI - Jetty HTTPS servlet的主要内容,如果未能解决你的问题,请参考以下文章
由于链接地址长度过长引起的”HTTP Error 400. The request URL is invalid”错误解决办法:修改注册表
获取 400 的状态 - "error":"invalid_grant" On Authentication
SharePoint REST API Online 批处理请求问题:获取 400 Bad Request, odata.error Invalid request
JWPlayer Uncaught Error: Invalid SRT file
Wordpress wp rest api v2 错误 400 (Bad Request)" Object code: "rest_invalid_param", mes