2014-02-12 81 views
2

我正在Tomcat上部署Web應用程序,它最終應該成爲提供多項服務的平臺。有時我需要能夠使用客戶端證書對用戶進行身份驗證,但只有當她訪問某個servlet/url時才能驗證證書並閱讀某些屬性。僅向某些特定資源請求客戶端證書認證

我得出的結論是,單獨使用Tomcat和jsp/servlet時,不可能僅使Web應用程序的一部分請求客戶端證書身份驗證。它可以是整個tomcat服務器,每次在任何地方請求用戶證書(clientAuth爲true或希望),或者對此方案無用的web.xml授權設置。

是否有框架,應用程序服務器,或者我可以用來實現這個請求的特定的經過驗證的體系結構?我想可能有一個單獨的服務器實例專用於相互SSL身份驗證,重定向用戶和轉發會話參數,但這個選項似乎相當複雜的管理。我敢打賭,有類似的解決方案,只是想知道是否有一些參考實施,指導方針,無論如何......謝謝。

回答

1

你不能單獨使用Tomcat來做到這一點。客戶端身份驗證最好是每個web應用程序,或者您可以將其設置爲server.xml Connector元素中的整個容器,無論它是什麼用途。

如果您需要此資源,您可以在前面使用Apache HTTPD並使其終止SSL。 (它仍然會將頭文件中的客戶端證書傳遞給Tomcat,以便Tomcat可以遵守Servlet規範,使其可用於Web應用程序。)然後,您可以配置幾乎所有關於SSL的所有內容,直到單個文件的級別。這也給你所有其他的好東西,如負載平衡。

+0

你可以用'clientAuth = 「假」'在連接器和' CLIENT-CERT'在'web.xml'文件:此將使用重新協商。 – Bruno

+0

我想一些分佈式架構是必要的。我看到了類似的平臺,使用cert auth,它傳遞了一些jsessionid和一系列參數,並通過不同的url進行重定向。我將看看Apache的httpd解決方案,謝謝。 – user8658912

+0

@布魯諾是的,每個網絡應用程序,而不是每個資源。調整我的文字。 – EJP

5

我以前用Tomcat直接使用客戶端證書重新協商來完成此操作。配置可能已經在Tomcat的新版本略有變化,但這裏的理念是:

  • 配置您的客戶端身份驗證連接器:設置其信任存儲參數,而是使用clientAuth="false"。這在the Tomcat documentation中有記錄:

    如果希望SSL堆棧在接受連接之前要求來自客戶端的有效證書鏈,請設置爲true。如果希望SSL堆棧請求客戶端證書,則設置爲希望,但如果未提供,則不會失敗。假的值(這是默認值)不需要證書鏈,除非客戶端請求使用CLIENT-CERT身份驗證的安全約束保護的資源。

  • 在你web.xml文件,使用這樣的:

    <web-app> 
        <display-name>My Webapp</display-name> 
        <security-constraint> 
         <web-resource-collection> 
          <web-resource-name>App</web-resource-name> 
          <url-pattern>/</url-pattern> 
         </web-resource-collection> 
         <auth-constraint> 
          <role-name>cert</role-name> 
         </auth-constraint> 
         <user-data-constraint> 
          <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
         </user-data-constraint> 
        </security-constraint> 
    
        <login-config> 
         <auth-method>CLIENT-CERT</auth-method> 
        </login-config> 
    
        <security-role> 
         <role-name>cert</role-name> 
        </security-role> 
    </web-app> 
    

    當然,適應web-resource-collection與您需要的URL模式。

+0

謝謝。那麼我嘗試了類似的東西(如果實際上不一樣),但證書中的用戶必須屬於以前在tomcat中定義的角色,所以它不是非常靈活/可伸縮的。 – user8658912

+1

你當然需要一些角色,不是嗎?如果您想允許您的CA接受任何證書,只需創建您自己的領域,爲所有進入的證書(並且具有您需要的屬性)分配一個通用基本角色:http://tomcat.apache.org/tomcat- 7.0-doc/realm-howto.html#Standard_Realm_Implementations – Bruno

+0

'web-resource-name'元素中的'App'對應什麼?它是否必須映射WAR(等)的名稱 - 還是它是一個「abritary」標籤? – monojohnny