2012-07-28 21 views
0

我有一個在Jetty中運行的應用程序。在它的前面,我有一個負載平衡器。要求是負載均衡器完成SSL解密,而Web容器只進行SSL客戶端身份驗證。帶有碼頭和空密碼的雙向SSL

的理論是,負載平衡器是解密內容非常有效的,能做到這一點,並在平原傳遞到Web容器。

不知道如何可以做到這一點?

回答

6

目前尚不清楚你所說的「空密碼」在您的標題是什麼意思。有3 possible candidatesTLS_NULL_WITH_NULL_NULL,TLS_RSA_WITH_NULL_MD5TLS_RSA_WITH_NULL_SHA。第一個不執行任何驗證,它們都不提供任何加密。他們對你的目標無疑是無用的。在瀏覽器和負載平衡器之間使用普通的密碼套件(包括身份驗證和加密)。負載均衡器和工作節點之間的加密通常是可選的,只有在您不信任其所在網絡時才需要加密(這將完全不同於SSL/TLS連接,並且與客戶端證書無關由最終瀏覽器完成驗證)。只有

在SSL/TLS服務器可以請求(並驗證)客戶端證書的認證。在這種情況下,這將是負載平衡器。

如果您希望您的負載均衡器處理SSL/TLS流量,它應驗證證書(可能是針對您配置的CA),然後將證書信息中繼到工作節點。

你怎麼做這將取決於負載平衡器。如果它是Apache Httpd服務器,mod_proxy_ajp將通過AJP協議(SSLOptions +ExportCertData +StdEnvVars)中繼客戶端證書。 mod_jk也可以根據需要中繼完整的客戶端證書鏈(JkOptions +ForwardSSLCertChain)。

如果你想使用mod_proxy_http,一招是通過HTTP標頭(mod_header)來傳遞證書,使用類似RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}s。如果它來自客戶端的瀏覽器(否則可以僞造它),你應該確保這個頭文件被清除。在這種情況下,你需要寫一個過濾器爲您的Jetty服務器的一部分來處理頭的地方入javax.servlet.request.X509CertificateHttpServletRequest屬性(它應該是X509Certificate數組)。在此之後,你應該或多或少處於與AJP相同的階段。如果它們能夠以類似的方式填充HTTP標頭,這也可以與其他負載平衡器一起工作。

+0

布魯諾,謝謝你的回答。我想你是對的,空密碼參考是有點誤導。我不知道這是解決方案的一部分。你在第二種解決方案中描述的內容更多地反映了我之後的情況。這個方法的通用名稱是什麼?這是標準的事情嗎?你說「在這種情況下......」。 「this」是指頭部來自瀏覽器的情況,還是指一般的方法?謝謝。 – Klaus 2012-07-28 02:59:56

+0

標題不應該來自瀏覽器,只能由負載均衡器插入(如果使用標題)。在所有情況下,客戶端證書驗證都將通過SSL/TLS服務器完成,該服務器是負載均衡器(另一種選擇是使用其他類型的負載均衡器處理每個工作器節點中的SSL/TLS連接,但是您說過在你的問題中,這不是你想要的)。我不認爲有一個標準來說明你應該使用哪個頭(如果你使用這個而不是APJ)。 – Bruno 2012-07-28 12:32:24