2012-04-05 67 views
2

我們有一個Grails web應用程序,運行在Apache2後面的tomcat7中。一切正常使用的ProxyPass與AJP協議罰款:切換到HTTPS時出現Grails + Tomcat + Apache錯誤

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

,其中9013是我們在Tomcat的server.xml AJP端口。

現在,我們的問題是這個。我們的Grails應用程序同時運行HTTP和HTTPS。當應用程序將一定區域內使用,Spring Security(Grails的Spring Security的核心插件)擊球時將您重定向使用HTTP到HTTPS的地址,例如:

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

春季安全將您重定向到:

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

但是現在,當重定向那裏,服務器掛起和最終火狐給出了「火狐已檢測到服務器重定向的方式,將永遠不會完成這個地址的請求。」錯誤。

我正確地認爲一些重定向與AJP代理變壞了嗎?任何人都可以提供更多關於這個設置如何工作的信息嗎?


在進一步看,我們發現以下幾點:

擊球時直接在Tomcat中的應用(通過IP和端口)一切工作100%。但是,當我們通過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似乎阿帕奇神奇地使它再次嘗試HTTP。 謝謝

+0

只有當重定向是否失敗,或者試圖直接進入一個HTTPS頁面時,它也失敗? – rlovtang 2012-04-05 12:59:09

+0

僅在重定向。 – 2012-04-05 13:01:01

回答

0

免責聲明,我不是Grails專家。

但是從你描述什麼,配置可能如下:

SSL卸載到apache httpd的。因此,只有ajp連接器需要在Tomcat中進行配置,或者可能只有一個額外的http連接器僅用於測試目的。 組態按照http://httpd.apache.org/docs/2.0/ssl/ssl_howto.html

<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> 

應該工作啓用apache httpd的SSL。

另一個好處是,當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連接器配置,它可能會給我們更多的線索。

0

不確定spring-security-core如何決定切換到HTTPS時使用哪個端口,但默認的Tomcat config對於AJP連接器具有redirectPort =「8443」,可能需要更改爲443,重定向將擊中Apache的HTTPS端口。

+0

這不會起作用,因爲我們需要運行多個tomcat實例,所以只要我們有兩個應用程序都需要https,就不能運行,因爲它不能綁定到端口443. – 2012-04-05 12:40:19

+0

這裏沒有涉及綁定,它只是Tomcat在重定向到HTTPS時將使用的端口的屬性。 – rlovtang 2012-04-05 12:48:09

+0

但是如上所述,我不確定spring-security-core是否使用這個屬性。 – rlovtang 2012-04-05 12:59:58

1

的Grails/Spring的安全具有的屬性:

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

,你可以爲使用與afforementioned的httpd-配置(端口80/443與SSL Apache的終止)從本鄉。您可能還需要適當地設置server.url屬性。

2

雖然我不能告訴你是如何解決它我可以告訴你問題是什麼。

它基本上與重寫入口點。

所以你應該在這些情況下做部分設置:

grails.plugins.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true 

然後,這將查找,如果我們是真正的HTTP/HTTPS通過設置標頭的默認值是:

RequestHeader set X-Forwarded-Proto「http」

現在我在nginx中正常工作。前面的apache問題是重寫規則ARENT拿起apache服務器。他們只是拿起自己。所以當它發生的時候,它基本上達到了無限的重定向,因爲它只知道你所在的9013服務器。

現在我想我只是寫我自己的自定義HttpsEntry,但我想有一些Apache設置,使這項工作正確。

0

順便說一句...這是你的答案。

所以做端口映射器設置和使用像我之前說過的通道安全。

所需要的信道的安全性,知道什麼時候要轉發到HTTP/HTTPS

但重定向裏面你需要保存代理設置,以便request.getServerPort()可以找到它們。您可以添加到您的Apache的httpd.conf:

ProxyPreserveHost在