【问题标题】:Pentaho j_spring_security_check mixed content. HTTPS to HTTPPentaho j_spring_security_check 混合内容。 HTTPS 到 HTTP
【发布时间】:2021-08-03 13:47:10
【问题描述】:

我已根据需要在 Tomcat 8.5 和 OpenJDK 1.8 上安装了 Pentaho (9.x)。 在它前面是带有 mod_proxy_http 的 Apache 2.4。

我的网站使用 HTTPS 提供服务,并且我有以下代理规则:

    RequestHeader set X-Forwarded-Proto "https"
    ProxyPreserveHost on

    ProxyPass "/pentaho"  "http://tomcat_host_ip:8080/pentaho"
    ProxyPassReverse "/pentaho"  "http://tomcat_host_ip:8080/pentaho"

    ProxyPass "/pentaho/"  "http://tomcat_host_ip:8080/pentaho/"
    ProxyPassReverse "/pentaho/"  "http://tomcat_host_ip:8080/pentaho/"

    ProxyPass "/pentaho/Login"  "http://tomcat_host_ip:8080/pentaho/Login"
    ProxyPassReverse "/pentaho/Login"  "http://tomcat_host_ip:8080/pentaho/Login"

当我在 POST 期间尝试登录时出现错误: https://pentaho.mywebsite.org/pentaho/j_spring_security_check

应用程序尝试使用 HTTP 协议而不是 HTTPS 进行响应。

在请求标头中,我有正确的引用者和来源: 来源:https://pentaho.mywebsite.org 推荐人:https://pentaho.mywebsite.org/pentaho/Login

但是响应头用 HTTP 而不是 https 回复: 位置http://pentaho.mywebsite.org/pentaho/

【问题讨论】:

  • 请复制/粘贴错误消息,而不是转录/解释它。可能您需要将RemoteIpValve 添加到您的Tomcat <Engine> 元素中。

标签: spring apache tomcat http-proxy mixed-content


【解决方案1】:

我解决了这个问题,只需将 proxyPort="443" 和 scheme="https" 添加到我在 Tomcat 中的 http 连接器。

规则

RequestHeader set X-Forwarded-Proto "https"

在 Apache 上没用。这是我正确的 Apache 配置

ProxyPreserveHost on

ProxyPass "/pentaho"  "http://tomcat_host_ip:8080/pentaho"
ProxyPassReverse "/pentaho"  "http://tomcat_host_ip:8080/pentaho"

ProxyPass "/pentaho/"  "http://tomcat_host_ip:8080/pentaho/"
ProxyPassReverse "/pentaho/"  "http://tomcat_host_ip:8080/pentaho/"

这是我的 Tomcat HTTP 连接器

   <Connector URIEncoding="UTF-8"
   port="8080" protocol="HTTP/1.1"
   connectionTimeout="20000"
   proxyPort="443"
   scheme="https"
   redirectPort="8443"
   relaxedPathChars="[]|"
   relaxedQueryChars="^{}[]|&amp;"
   maxHttpHeaderSize="65536"
   />

【讨论】:

    【解决方案2】:

    Servlet 应用程序使用ServletRequestschemeserverNameserverPort 属性来生成超链接。通常Tomcat从Host请求头中获取后两者,而scheme依赖于连接器。

    如果你使用反向代理,上面的逻辑可能还不够。你有两个解决方案:

    静态设置scheme

    在您的情况下,代理使用 HTTPS,而 Tomcat 使用 HTTP,因此您必须覆盖 schemesecure 属性:

    <Connector
        port="8080"
        scheme="https"
        secure="true"
        ...
    

    而 Apache HTTP Server 配置可以缩短为:

    ProxyPreserveHost on
    
    ProxyPass "/pentaho"  "http://tomcat_host_ip:8080/pentaho"
    ProxyPassReverse "/pentaho"  "http://tomcat_host_ip:8080/pentaho"
    

    请注意,在您的回答中您没有设置secure 属性:此属性决定传输是否是机密的。如果您不将其设置为 true,则当应用程序要求机密传输时,Tomcat 会自动将浏览器重定向到redirectPort(参见Securing Web Applications)。

    此解决方案只有在您的代理仅将 HTTPS 请求转发到 Tomcat 时才能正常工作。

    动态设置scheme

    如果您将 HTTP 和 HTTPS 请求都转发到 Tomcat,服务器需要一种方法来区分它们。因此,您需要在 Tomcat 配置中添加 RemoteIpValve

    <Valve className="org.apache.catalina.valves.RemoteIpValve" />
    <Connector
        port="8080"
        redirectPort="443"
        ...
    

    并要求 Apache HTTP 服务器添加 X-Forwarded-Proto 标头:

    RequestHeader set X-Forwarded-Proto "expr=%{REQUEST_SCHEME}"
    ProxyPreserveHost on
    
    ProxyPass "/pentaho"  "http://tomcat_host_ip:8080/pentaho"
    ProxyPassReverse "/pentaho"  "http://tomcat_host_ip:8080/pentaho"
    

    此方案还有一个优点是可以设置客户端的remoteHostremoteAddr 而不是代理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-16
      • 2020-08-18
      • 2016-09-04
      • 2015-08-13
      • 1970-01-01
      • 2015-12-04
      • 2018-04-23
      相关资源
      最近更新 更多