jelastic grails将http重定向到https

时间:2014-02-12 19:44:26

标签: grails https spring-security tomcat6 jelastic

我有一个域app.mydomain.com,它用A记录映射到公共IP(来自属于mysub.jelastic.dogado.eu的tomcat服务器) 我已经配置了SSL自定义证书,所有HTTPS请求都运行良好。

我需要的是我的应用只使用HTTPS,所有HTTP请求都被重定向到HTTPS, 根据Spring安全插件(我在我的应用程序上有1.2.7.4),我以这种方式配置:

grails.plugins.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
    grails.plugins.springsecurity.portMapper.httpPort = 8080
    grails.plugins.springsecurity.portMapper.httpsPort = 8443
    grails.plugins.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto'
    grails.plugins.springsecurity.secureChannel.secureHeaderValue = 'http'
    grails.plugins.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
    grails.plugins.springsecurity.secureChannel.insecureHeaderValue = 'https'
    grails.plugins.springsecurity.auth.forceHttps = true
    grails.plugins.springsecurity.secureChannel.definition = [
            '/**':               'REQUIRES_SECURE_CHANNEL'
    ]

在localhost上它工作得非常好,所有的http请求都被重定向到https但是在jelastic nothig中发生了。我尝试了很多配置,将https端口替换为8743/443,但结果相同。任何帮助都会被贬低。

非常感谢, 克特林

2 个答案:

答案 0 :(得分:1)

如果您的环境中有负载均衡器(或使用共享解析程序,但由于您使用的是自定义SSL证书,在这种情况下无法应用),则仅设置X-Forwarded-Proto标头。

如果您的环境中没有负载均衡器,那么检查不起作用的原因 - 因为这些标头根本就没有设置。

如果您有负载均衡器,则对Tomcat的所有请求都将定向到端口80(通过端口转发重定向到8080);其中包括发送到https的请求(因为负载均衡器在这种情况下执行'SSL卸载'。因此,您正在寻求一个不可能的组合在您的grails规则(8743和X-Forwarded-Proto)。根据您的环境拓扑,您将有一个这些案件或其他案件,但不是两者兼而有之。

编辑:你还应该仔细检查你的server.xml以确保你有这个:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="443" />

注意redirectPort值;它应该是443,因为这是将被发送到浏览器进行重定向的端口 - 使用负载均衡器(或Jelastic Shared Resolver)代理请求,浏览器需要在端口443上请求(即使Tomcat SSL连接器是在8743上配置 - 如果适用),因为代理使用标准端口编号(即https://没有任何端口号= 443)。

即使您使用的是独立的Tomcat(无负载均衡器,也未通过Jelastic Shared Resolver),对443的请求将自动转发给8743。

答案 1 :(得分:0)

感谢Damien,你的答案解决了这个问题。对于任何感兴趣的人,这是配置(Config.groovy):

 production {
    grails.app.context = "/"        
    grails.serverURL = "https://yourdomain.com"
    grails.plugins.springsecurity.portMapper.httpPort = 80
    grails.plugins.springsecurity.portMapper.httpsPort = 443
    grails.plugins.springsecurity.auth.forceHttps = true
    grails.plugins.springsecurity.secureChannel.definition = [
            '/**': 'REQUIRES_SECURE_CHANNEL'
    ]
  }

将它放在server.xml中:

<Connector port="80" protocol="HTTP/1.1"
       connectionTimeout="20000"
       redirectPort="443" />

我认为8080也有效。

制造战争,部署。