2

我有一个域 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 中没有发生任何事情。我尝试了很多配置,将 https 端口替换为 8743/443,但结果相同。任何帮助将不胜感激。

非常感谢,卡塔林

4

2 回答 2

1

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

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

如果您确实有负载均衡器,则对 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 共享解析器)代理请求,浏览器需要在端口 443 上请求(即使 Tomcat SSL 连接器是在 8743 上配置 - 如果适用),因为代理使用标准端口编号(即 https:// 没有任何端口号 = 443)。

即使您使用的是独立的 Tomcat(没有负载均衡器,也不是通过 Jelastic Shared Resolver),这些对 443 的请求也会自动转发到 8743。

于 2014-02-12T22:41:08.060 回答
0

谢谢达米安,你的回答解决了这个问题。对于任何感兴趣的人,这是配置(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也可以。

发动战争,部署。

于 2014-02-13T21:19:22.420 回答