我有一个域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,但结果相同。任何帮助都会被贬低。
非常感谢, 克特林
答案 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也有效。
制造战争,部署。