切换到HTTPS时Grails + Tomcat + Apache错误

时间:2012-04-05 10:39:48

标签: apache tomcat grails ajp

我们有一个Grails Web应用程序,在Apache2后面的tomcat7中运行。通过使用带有ajp协议的ProxyPass,一切正常:

ProxyPass         / ajp://localhost:9013/
ProxyPassreverse  / ajp://localhost:9013/

其中9013是我们在tomcat的server.xml中的AJP端口。

现在,我们的问题是这样。我们的Grails应用程序运行HTTP和HTTPS。当进入应用程序中的某个区域时,Spring Security(Grails Spring Security Core插件)会将您从使用HTTP的地址重定向到HTTPS,例如在点击时:

http://www.example.com/secure/path

Spring Security会将您重定向到:

https://www.example.com/secure/path

但是现在,当它重定向到那里时,服务器挂起,最后Firefox给出“Firefox检测到服务器正在以永远不会完成的方式重定向该地址的请求。”错误

我是否认为使用AJP代理进行重定向会变坏?任何人都可以提供有关此设置如何工作的更多信息吗?


进一步观察,我们发现了以下内容:

当直接在tomcat中访问应用程序时(通过IP和端口),一切都可以正常工作。但是一旦我们通过Apache,Spring Security重定向就不起作用了。您将继续在Apache日志中获得以下内容:

staging.server.com:80 41.133.194.248 - - [05/Apr/2012:14:03:41 +0200] "GET /user/signup HTTP/1.1" 302 223 "http://staging.server.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0"
staging.server.com:80 41.133.194.248 - - [05/Apr/2012:14:03:42 +0200] "GET /user/signup HTTP/1.1" 302 223 "http://staging.server.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0"
staging.server.com:80 41.133.194.248 - - [05/Apr/2012:14:03:42 +0200] "GET /user/signup HTTP/1.1" 302 223 "http://staging.server.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0"
staging.server.com:80 41.133.194.248 - - [05/Apr/2012:14:03:42 +0200] "GET /user/signup HTTP/1.1" 302 223 "http://staging.server.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0"

...

而不是重定向到https似乎apache神奇地让它再次尝试http。 感谢

5 个答案:

答案 0 :(得分:2)

虽然我无法告诉你如何解决它,但我可以告诉你问题是什么。

它基本上是重写入口点。

因此,设置在这些情况下你应该做的部分内容是:

grails.plugins.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true

如果我们真的在http / https上,通过设置标题默认为:

,这将会查找

RequestHeader设置X-Forwarded-Proto“http”

现在我在nginx中运行良好。在前面有apache的问题是重写规则ARENT拿起apache服务器。他们只是拿起自己。因此,当它开始时它基本上达到了无限重定向,因为它所知道的就是你所使用的9013服务器。

现在我想我要编写自己的自定义HttpsEntry,但我想有一些apache设置可以使这项工作正常。

答案 1 :(得分:1)

Grails / Spring-Security具有以下属性:

grails {
   // redirect ports
   plugins {
      springsecurity {
         portMapper {
            httpPort = 80
            httpsPort = 443
         }
      }
   }
}

你可以使用来自hongo的affore的httpd-config(端口80/443,在Apache终止的SSL)。您可能还需要正确设置server.url属性。

答案 2 :(得分:0)

不确定spring-security-core在切换到HTTPS时如何决定使用哪个端口,但默认的Tomcat配置对于AJP连接器有redirectPort =“8443”,可能需要更改为443以便重定向将命中Apache的HTTPS端口。

答案 3 :(得分:0)

免责声明,我不是Grails的专家。

但是根据您的描述,配置可能如下:

SSL被卸载到apache httpd。因此,只需要在Tomcat中配置ajp连接器,或者可能只使用额外的http连接器进行测试。 按照http://httpd.apache.org/docs/2.0/ssl/ssl_howto.html为apache httpd配置启用SSL 和

<VirtualHost _default_:80>

    RedirectPermanent /secure/path https://www.example.com/secure/path
    ProxyPass         / ajp://localhost:8009/
    ProxyPassreverse  / ajp://localhost:8009/
</VirtualHost>

<VirtualHost _default_:443>

    # SSL config
    ...
    ProxyPass         / ajp://localhost:8009/
    ProxyPassreverse  / ajp://localhost:8009/
</VirtualHost>

应该有用。

另一个好处是,当SSL卸载到apache httpd时,您可能会看到性能提升。

此外,为什么不强制使用SSL:

<VirtualHost _default_:80>
RedirectPermanent / https://www.example.com/
</VirtualHost>

<VirtualHost _default_:443>

# SSL config
    ...

ProxyPass         / ajp://localhost:8009/
ProxyPassreverse  / ajp://localhost:8009/
</VirtualHost>

至于为什么你有无限循环,它可能与Spring Security的sendRedirect有关。 如果您可以发布完整的Apache VirtualHost和tomcat ajp连接器配置,它可能会给我们更多线索。

答案 4 :(得分:0)

顺便问一下......这是你的回答。

端口映射器设置也是如此,并使用我之前所说的通道安全性。

需要通道安全性才能知道何时转发到http / https

但是在重定向内部,您需要保留代理设置,以便request.getServerPort()可以找到它们。您可以将其添加到Apache httpd.conf:

ProxyPreserveHost On