仅通过 HTTPS 使用嵌入式 Jetty 9
Using embedded Jetty 9 with HTTPS only
我正在使用嵌入式 Jetty 9,我想允许 https 访问,但不允许 http。
我知道我可以在 Jetty 中轻松配置重定向 web.xml,但我在嵌入式版本中没有该文件。我知道我可以使用任何文件并从嵌入式版本指向它,但这应该更容易。
所以我在这里搜索并找到了这个 http://blog.anvard.org/articles/2013/10/05/jetty-ssl-server.html 作者说 "Of course, we could force the use of HTTP/S by just removing the HTTP connector."
所以我就是这样做的:
Server server = new Server();
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath());
sslContextFactory.setKeyStorePassword(Keys.DOMAIN_CERTIFICATE_JKS_KEYSTORE_PASSWORD);
sslContextFactory.setKeyManagerPassword(Keys.DOMAIN_CERTIFICATE_KEY_MANAGER_PASSWORD);
HttpConfiguration httpsConfiguration = new HttpConfiguration();
SecureRequestCustomizer secureRequestCustomizer = new SecureRequestCustomizer();
httpsConfiguration.addCustomizer(secureRequestCustomizer);
ServerConnector serverConnector = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(httpsConfiguration));
serverConnector.setHost("192.168.0.5");
serverConnector.setPort(9443);
serverConnector.setIdleTimeout(15000);
server.setConnectors(new Connector[] { serverConnector });
问题:它似乎不起作用。 https 工作正常,但是当我访问 http 时,我得到 200 OK
响应,正文中有垃圾(而不是预期的 json 响应)。所以服务器似乎处理了请求,但加密错误,无论如何。还是我忽略了什么,我的配置不好?
--
据我所知,你做的一切都是正确的。连接到 SSL 端口并发送常规 HTTP(w/o SSL 握手)返回 SSL 警报消息。您的 HTTP 客户端(出于某种原因)正在向您发送 200 OK
消息,尽管甚至没有收到 HTTP 响应。
您收到的是一条 SSL 警报消息。
15 03 03 00 02 02 50 // response
15 = ALERT
03 03 = SSL version (TLS 1.x)
00 02 = Message Length
02 50 = Message
我正在使用嵌入式 Jetty 9,我想允许 https 访问,但不允许 http。
我知道我可以在 Jetty 中轻松配置重定向 web.xml,但我在嵌入式版本中没有该文件。我知道我可以使用任何文件并从嵌入式版本指向它,但这应该更容易。
所以我在这里搜索并找到了这个 http://blog.anvard.org/articles/2013/10/05/jetty-ssl-server.html 作者说 "Of course, we could force the use of HTTP/S by just removing the HTTP connector."
所以我就是这样做的:
Server server = new Server();
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath());
sslContextFactory.setKeyStorePassword(Keys.DOMAIN_CERTIFICATE_JKS_KEYSTORE_PASSWORD);
sslContextFactory.setKeyManagerPassword(Keys.DOMAIN_CERTIFICATE_KEY_MANAGER_PASSWORD);
HttpConfiguration httpsConfiguration = new HttpConfiguration();
SecureRequestCustomizer secureRequestCustomizer = new SecureRequestCustomizer();
httpsConfiguration.addCustomizer(secureRequestCustomizer);
ServerConnector serverConnector = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(httpsConfiguration));
serverConnector.setHost("192.168.0.5");
serverConnector.setPort(9443);
serverConnector.setIdleTimeout(15000);
server.setConnectors(new Connector[] { serverConnector });
问题:它似乎不起作用。 https 工作正常,但是当我访问 http 时,我得到 200 OK
响应,正文中有垃圾(而不是预期的 json 响应)。所以服务器似乎处理了请求,但加密错误,无论如何。还是我忽略了什么,我的配置不好?
--
据我所知,你做的一切都是正确的。连接到 SSL 端口并发送常规 HTTP(w/o SSL 握手)返回 SSL 警报消息。您的 HTTP 客户端(出于某种原因)正在向您发送 200 OK
消息,尽管甚至没有收到 HTTP 响应。
您收到的是一条 SSL 警报消息。
15 03 03 00 02 02 50 // response
15 = ALERT
03 03 = SSL version (TLS 1.x)
00 02 = Message Length
02 50 = Message