【问题标题】:HTTPS requests to embedded Jetty failing对嵌入式 Jetty 的 HTTPS 请求失败
【发布时间】:2014-12-25 13:42:39
【问题描述】:

编辑:这实际上根本不是 Jetty 问题。我尝试使用带有自签名证书的 HTTPS 运行服务器,它可以工作 美好的。因此,使证书正常工作是一个问题。我要 投票结束这个问题。

我正在尝试使用带有嵌入式 Jetty (v9.2.3) 的 SSL 设置安全站点。虽然我一直在开发该站点,但除了在本地进行测试外,我还在服务器上进行了现场演示,供其他人查看,通过 HTTP 在端口 8080 上运行。

我现在正在尝试切换到 HTTPS,但它不起作用。根据日志,该站点启动正常,显然它正在侦听端口 443,但所有请求都立即被拒绝。 Chrome 告诉我该网页不可用。但是服务器上没有任何东西表明错误。启动服务器的终端或日志都没有输出。如果我切换回使用 HTTP 端口 8080,那么它会正常处理请求。

下面的启动代码中使用的keystore 是使用由证书颁发机构 (server.crt) 颁发的证书生成的,具有以下内容:

keytool -keystore keystore -import -alias keyalias -file server.crt -trustcacerts

我还应该提到,当我使用自签名证书在 localhost 上运行服务器时,它可以工作。但是,如果 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);
    }

...服务器从以下输出开始:

[main] INFO org.eclipse.jetty.util.log - Logging initialized @202ms
[main] INFO org.eclipse.jetty.server.Server - jetty-9.2.3.v20140905
[main] INFO org.eclipse.jetty.webapp.StandardDescriptorProcessor - NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
[main] INFO org.eclipse.jetty.server.handler.ContextHandler - Started o.e.j.w.WebAppContext@37132aca{/,file:/home/ubuntu/CS4L/war/,AVAILABLE}{war}
[main] INFO org.eclipse.jetty.server.ServerConnector - Started ServerConnector@261bf0a0{SSL-http/1.1}{0.0.0.0:443}
[main] INFO org.eclipse.jetty.server.Server - Started @5792ms

编辑:
我的服务器在 AWS EC2 实例上运行,并且有入站请求过滤器,但允许从端口 80 和 443 进入的所有请求。

【问题讨论】:

  • 我有一个非常相似的问题。虽然能够使用 Chrome 从各种 Linux、Windows XP 和 MacOS 机器(甚至是 Android 5.x 设备)通过 HTTPS 连接到服务器,但无法使用 Chrome 从 Windows 7 和 8 机器连接到服务器。看起来 HTTPS 握手没有成功完成。您的问题解决了吗?原因是什么?
  • 如果报告的问题对您来说仍然是个问题,这个stackoverflow.com/questions/30093816/… 可能很有价值。
  • 我现在确实可以使用它,但很抱歉,我只是不记得是什么解决了这个问题。我希望我当时更新了这个问题,因为它现在困扰着我。我的服务器启动代码与我最初发布的代码相同,只是我在 HttpConfiguration 对象初始化之后添加了 https.setSecurePort(port)。也许这只是证书中通用名称的问题。如果有什么我可以帮你检查的,请告诉我。
  • 谢谢。它现在也对我有用(:
  • 酷,是 setSecurePort 调用修复了它吗?

标签: java ssl jetty ssl-certificate embedded-jetty


【解决方案1】:

我遇到了类似的问题,原因是证书的密码与设置为密钥库的密码不同。它们必须相同。

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多