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="^[]|&"
maxHttpHeaderSize="65536"
/>
【讨论】:
【参考方案2】:Servlet 应用程序使用ServletRequest
的scheme
、serverName
和serverPort
属性来生成超链接。通常Tomcat从Host
请求头中获取后两者,而scheme
依赖于连接器。
如果你使用反向代理,上面的逻辑可能还不够。你有两个解决方案:
静态设置scheme
在您的情况下,代理使用 HTTPS,而 Tomcat 使用 HTTP,因此您必须覆盖 scheme
和 secure
属性:
<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"
此方案还有一个优点是可以设置客户端的remoteHost
和remoteAddr
而不是代理的。
【讨论】:
以上是关于Pentaho j_spring_security_check 混合内容。 HTTPS 到 HTTP的主要内容,如果未能解决你的问题,请参考以下文章