Pentaho j_spring_security_check 混合内容。 HTTPS 到 HTTP

Posted

技术标签:

【中文标题】Pentaho j_spring_security_check 混合内容。 HTTPS 到 HTTP【英文标题】:Pentaho j_spring_security_check mixed content. HTTPS to HTTP 【发布时间】:2021-05-13 08:53:02 【问题描述】:

我已根据需要在 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> 元素中。 【参考方案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 而不是代理的。

【讨论】:

以上是关于Pentaho j_spring_security_check 混合内容。 HTTPS 到 HTTP的主要内容,如果未能解决你的问题,请参考以下文章

必备工具:使用Pentaho进行数据迁移

Pentaho 认证方法

Pentaho 组件集成

Pentaho 中的 Hive 数据集成错误

Pentaho 报告缓慢

多个 Pentaho 转换“变量?”