2012-05-30 27 views
2

是否可以在Tomcat 6.xxx中並排使用兩種認證方法?Tomcat 6 Ssl和表單認證並排

故事:現在我的應用程序在端口80和443上運行。在443連接器中有clientAuth =「want」參數。 如果客戶超過80歲,則不需要任何證書。但是,當客戶端來到443和客戶端智能卡在讀卡器,證書被自動詢問,即使客戶端不想登錄。

對於登錄與用戶證書,我有FormFallBack authenticator ,這意味着如果客戶端沒有發送證書(他在讀卡器中沒有智能卡)或者驗證者驗證失敗,驗證者會直接進入窗體,在那裏他可以用密碼和用戶名登錄。 我的英語不是很好,所以這裏是類似的系統的更好的概述:http://wiki.apache.org/tomcat/SSLWithFORMFallback

但要求用戶證書的過程是惱人的用戶,如果瀏覽器多次請求證書,如果用戶不想使用用於登錄的智能卡(但他擁有讀卡器),而不是他想用用戶名和密碼登錄。

所以有以下選項: 我有登錄頁面,其中是用戶名和密碼字段和登錄按鈕。如果用戶按登錄按鈕,他將使用用戶名和密碼登錄(指向形成驗證者)。

但在同一頁面有按鈕「使用智能卡登錄」。如果他按下這個按鈕,服務器要求用戶證書並將其提供給認證者。

希望你明白這個問題。

回答

1

我相信你必須編寫自己的Tomcat認證器來理解這些需求。

由於AFAICT您要求能夠基於每個用戶重新配置SSL連接器的行爲,並且您無法在SSL協商完成之前爲用戶配置連接器,因此實際上可能無法實現地點。

+0

您可以根據路徑重新協商。 – Bruno

+0

@布魯諾如何在Tomcat中配置這樣的重新協商? –

+0

我在回答中描述的方式(使用CLIENT-CERT' auth方法進行安全性約束)。 – Bruno

1

如果您通過servlet會話保持身份驗證狀態,則可以通過提供兩種不同的按鈕(或鏈接),通過表單或客戶端證書提供登錄。

我在這裏假設你可以有類似/login/form的窗體和/login/cert通過客戶端認證的路徑。

當您使用SSL/TLS重新協商訪問/login/cert時,您可以根據需要觸發客戶端證書驗證。爲此,請在連接器配置中使用clientAuth="false",但在webapp中使用<auth-method>CLIENT-CERT</auth-method>將安全約束放在該路徑上:這將在需要時觸發重新協商。

爲此,您需要JRE that supports RFC 5746(Oracle Java 6 r22或更高版本)的版本,您的客戶也應該支持它。現代版本的瀏覽器/操作系統應該支持這一點。

0

請參閱Google代碼中的AuthenticRoast項目。它確實如此,更多。