如何在443以外的端口上使用HTTPS嵌入Jetty?

时间:2014-10-02 14:32:55

标签: java ssl https jetty embedded-jetty

我一直在Ubuntu 14.04上使用嵌入式Jetty(让我们称之为serverA)在默认端口443上通过HTTPS提供Web应用程序(使用自签名证书)。它现在已经很好用,但我想在同一台机器上运行另一个嵌入式Jetty Web服务器(serverB)。我希望serverB使用默认端口443运行SSL,因此我需要更改serverA以侦听其他端口上的请求。

我一直在尝试使用444和8080的serverA。服务器启动很好,告诉我它正在侦听正确端口上的请求。但请求只是挂起,服务器日志告诉我什么。如果我启动服务器监听端口443,那么一切正常。

只要我将Web服务器配置为使用SSL,我认为使用哪个端口并不重要。还有什么我需要做的吗?

这是我的启动代码:

    // Java 7 bug (feature?) - this disables SNI everywhere...
    // required or else outgoing HTTPS requests will fail
    System.setProperty("jsse.enableSNIExtension", "false");

    PropertyConfigurator.configure("./log4j.properties");
    Server server = new Server();

    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath("/");
    webapp.setWar("war");
    server.setHandler(webapp);

    HttpConfiguration https = new HttpConfiguration();
    https.addCustomizer(new SecureRequestCustomizer());

    SslContextFactory sslContextFactory = new SslContextFactory();
    sslContextFactory.setKeyStorePath("keystore.jks");
    sslContextFactory.setKeyStorePassword("password");
    sslContextFactory.setKeyManagerPassword("password");

    ServerConnector sslConnector = new ServerConnector(server,
            new SslConnectionFactory(sslContextFactory, "http/1.1"),
            new HttpConnectionFactory(https));
    sslConnector.setPort(port);

    server.setConnectors(new Connector[] { sslConnector });

    try {
        LOG.info("Starting server on port " + port);
        server.start();
        server.join();

    } catch (Exception e) {
        LOG.fatal("The web server has crashed", e);
    }

注意:这是因为StackOverflow而不是SuperUser或其他原因是因为据我所知,用于HTTPS的端口并不重要。我假设这是Jetty问题,那么。

修改
对不起,忘了提Jetty版。这是 9.2.0

1 个答案:

答案 0 :(得分:1)

试试这个,因为你没有告诉jetty什么是安全的,它只是使用默认值。

HttpConfiguration https = new HttpConfiguration();
https.setSecurePort(port); /* missing this */
https.addCustomizer(new SecureRequestCustomizer());

这可能看起来很奇怪,但实际上是需要的,因为即使连接以非安全的方式到达,您也可以被认为是安全的。比如来自码头前面的代理或者ssl终端负载均衡器(各种方式相当惊人)