pentaho j_spring_security_检查混合内容https到http

wz3gfoph  于 2021-10-10  发布在  Java
关注(0)|答案(2)|浏览(347)

我已经根据需要在Tomcat8.5和OpenJDK1.8上安装了pentaho(9.x)。在它前面是带有mod_proxy_http的Apache2.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"

当我尝试登录时,在发布过程中出现错误:https://pentaho.mywebsite.org/pentaho/j_spring_security_check
应用程序尝试使用http协议而不是https进行响应。
在请求头中,我有正确的referer和origin:origin:https://pentaho.mywebsite.org 推荐人:https://pentaho.mywebsite.org/pentaho/login
但是响应头使用http而不是https:location进行回复http://pentaho.mywebsite.org/pentaho/

qjp7pelc

qjp7pelc1#

我只需将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"
   />
lqfhib0f

lqfhib0f2#

servlet应用程序使用 scheme , serverNameserverPort a的性质 ServletRequest 生成超链接。通常,tomcat从 Host 请求标头,而 scheme 取决于连接器。
如果使用反向代理,上述逻辑可能不够。您有两种解决方案:

静态设置方案

在您的情况下,代理使用https,而tomcat使用http,因此您必须覆盖 schemesecure 特性:

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

而apache http服务器配置可以缩短为:

ProxyPreserveHost on

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

请注意,在你的回答中,你没有设置 secure 属性:此属性决定传输是否机密。如果未将其设置为true,tomcat将自动将浏览器重定向到 redirectPort 每当应用程序要求保密传输时(参见保护web应用程序)。
只有当您的代理仅将https请求转发给tomcat时,此解决方案才能正常工作。

动态设置方案

如果将http和https请求转发给tomcat,服务器需要一种区分它们的方法。因此,您需要添加一个 RemoteIpValve 到您的tomcat配置:

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

并要求ApacheHTTP服务器添加 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 而不是那些代理。

相关问题