【问题标题】:How to user embedded Jetty with HTTPS over port other than 443?如何通过 443 以外的端口使用 HTTPS 使用嵌入式 Jetty?
【发布时间】:2014-11-27 13:55:34
【问题描述】:

我一直在 Ubuntu 14.04(使用自签名证书)上通过 HTTPS 在默认端口 443 上使用嵌入式 Jetty(我们称之为 serverA)提供 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

【问题讨论】:

  • 只要您使用的是已发布且稳定的码头(不是 M0、M1、RC0 等),就可以了。最新的成熟/稳定版本是9.2.3.v20140905
  • 碰巧,我正在使用 jetty-all-9.2.0.M0.jar - 我不应该吗?
  • 这是“里程碑 0”的预发布版本,被认为是不稳定的,仅供测试人员使用。

标签: java ssl https jetty embedded-jetty


【解决方案1】:

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

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

这可能看起来很奇怪,但实际上是必需的,因为即使连接以非安全方式到达,您也可以被认为是安全的。比如从一个代理或者一个 ssl 终止的负载均衡器在 jetty 前面(方式的多样性是相当惊人的)

【讨论】:

  • 仍然需要sslConnector.setPort(port) 吗?
  • 仍然挂在端口 444 上,该语句包含在您的解决方案中。我尝试删除sslConnector.setPort(port),但这也不起作用。
  • 您的代码在这里运行良好(我选择端口 12444,只是因为我没有以 root 身份运行)。尝试使用 1024 以上的端口,如果它可以正常工作,那么您可能遇到了特权端口问题或防火墙问题。
  • 呸,我知道它是什么。我在具有入站 IP/端口限制的 AWS EC2 实例上运行 - 谢谢!
猜你喜欢
  • 2016-12-16
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 2017-08-28
相关资源
最近更新 更多