Jetty,isSecure()在HTTPS连接上返回false

时间:2018-03-12 10:01:34

标签: java https jetty embedded-jetty

我遇到问题isSecure()在HTTPS连接上返回false时返回false,实际上是来自普通CA的有效证书的HTTPS连接,包括用户和服务器证书。为什么呢?

这是一个callstack:

callstack

isSecure()返回的成员为false:

enter image description here

这是Jetty 9.4.8。

更新

HttpChannelOverHttp(HttpChannel).onRequest(MetaData$Request) line: 638上,我看到_request.setSecure(HttpScheme.HTTPS.is(request.getURI().getScheme()));可以将标记设置为true。很遗憾,URI格式不完整//host.name:8081/path/a/b/cgetScheme()返回null,导致false返回is()。 WTH?

更新2

我似乎可以通过将以下内容添加到HttpConfiguration中的jetty-config.xml来解决此问题:

                <Call name="addCustomizer">
                  <Arg>
                      <New class="org.eclipse.jetty.server.SecureRequestCustomizer" />
                  </Arg>
                </Call>

但我不明白为什么这是必要的以及为什么它不起作用OOTB。

1 个答案:

答案 0 :(得分:1)

正如您自己发现的那样,您错过了配置。

您觉得需要手动添加此配置这一事实告诉我您正在使用旧版本的Jetty。 (请考虑升级,现在更容易控制,如下所示)

SecureRequestCustomizer中的HttpConfiguration负责处理SSL证书,SNI,主机检查,SSL / TLS的各种HttpServletRequest属性等的识别。

在旧版本的Jetty上看起来像这样。

<Call name="addCustomizer">
  <Arg>
    <New class="org.eclipse.jetty.server.SecureRequestCustomizer" />
  </Arg>
</Call>

在较新版本的Jetty上,这是由jetty-ssl.xml xml(ssl模块的一部分)添加的,它看起来像这样......

<Configure id="Server" class="org.eclipse.jetty.server.Server">

  <!-- [snip] ssl connector setup -->

  <!-- =========================================================== -->
  <!-- Create a TLS specific HttpConfiguration based on the        -->
  <!-- common HttpConfiguration defined in jetty.xml               -->
  <!-- Add a SecureRequestCustomizer to extract certificate and    -->
  <!-- session information                                         -->
  <!-- =========================================================== -->
  <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
    <Arg><Ref refid="httpConfig"/></Arg>
    <Call name="addCustomizer">
      <Arg>
        <New class="org.eclipse.jetty.server.SecureRequestCustomizer">
          <Arg name="sniHostCheck" type="boolean"><Property name="jetty.ssl.sniHostCheck" default="true"/></Arg>
          <Arg name="stsMaxAgeSeconds" type="int"><Property name="jetty.ssl.stsMaxAgeSeconds" default="-1"/></Arg>
          <Arg name="stsIncludeSubdomains" type="boolean"><Property name="jetty.ssl.stsIncludeSubdomains" default="false"/></Arg>
        </New>
      </Arg>
    </Call>
  </New>

</Configure>

默认情况下不启用的原因是,如果没有Jetty处理实际的SSL / TLS,请求可以被认为是安全的。这是转发的场景,来自负载均衡器,代理,防火墙,网关等......在这种情况下,SSL / TLS由另一个进程处理,该进程通过非安全通道与Jetty通信(标准HTTP不加密) ,代理,unix套接字等)。然后通过“转发”报头将连接安全或不连接的事实传达给码头。

此转发行为由其他自定义程序org.eclipse.jetty.server.ForwardedRequestCustomizer控制(在jetty-http-forwarded.xml中找到,http-forwarded模块的哪一部分)