2016-07-15 111 views
0

我知道Tomcat提供了SNI和相互認證,但是是否可以僅爲選定的應用程序/路徑啓用MA?即讓我們說,我有我的服務器上的以下應用程序/端點:Tomcat + SNI +相互認證

/app1 
/app2/human 
/app2/robot 
其中 /APP 2 /人用於人類和 /APP 2 /機器人所使用的機器人,計算機和其他設備(這樣

例如/ app2/human服務HTML和/ app2/robot服務JSON)。現在,我可以以某種方式配置Tomcat以接受連接到/app1/app2 /人通過SSL沒有MA和/app2 /機器人只有當客戶端提交有效證書?

當然,我希望不用爲每個應用程序配置單獨的端口/連接器,這很容易。

在此先感謝。

回答

1

Tomcat不會爲不同路徑提供選擇性相互身份驗證,但是如果您只需要在webapp級別(而不是在特定的Web應用程序內部)應用此選擇性相互身份驗證,則可能會能夠爲特殊的Web應用程序提供單獨的<Connector>。這需要單獨的<Service>,因此需要<Host>,當然還有一個不同的端口號(除非您碰巧有一個單獨的網絡接口,您可以使用它來保留端口)。

我還沒有嘗試過,但我會想象,理論上,可以配置SNI + client-auth,以便特定的主機名具有不同的客戶端身份驗證要求,但Tomcat中沒有這樣的代碼目前支持。

Tomcat的配置可以使用不同的信任存儲和主機每一個不同的certificateVerification設置,但它不會讓你去改變它每路

另一個選擇是將Tomcat配置爲「需要」(或甚至需要)客戶端證書,然後使用Filter執行檢查。 Filter s可以應用在每個路徑的基礎上,再加上你的應用程序變得更具可移植性,因爲你不依賴於某些可能是Tomcat特有的功能。

看看這個線程爲我幾年前做了這個。有(最終)一些示例代碼加上大量的參考資料,我如何得到所有的信息把它放在一起:http://markmail.org/thread/vxwwli5nzt4itfr2

+0

我認爲第二個連接器是一個非常簡單的事情可怕的開銷。 由於Mark Thomas在Tomcat 9中增加了TLS虛擬主機,所以這對於那些需要的人來說是一個非常缺失的功能。 –

+1

我想只有那個讓提交得到任何愛的人:( –

1

根據this並通過閱讀文檔,您不能在每個路徑基礎上進行選擇性相互認證。因爲客戶端身份驗證是在連接器級別配置的,所以全部或全部都沒有您可能正在尋找SSL renegotation with client auth,這可能未實現,因爲您可能從Apache HTTPd中使用該實用程序。

+0

@MarkThomas我在這裏嗎? –

+0

謝謝,這就是我認爲看像SSLSocket,SSLSocketFactory等類的東西。它看起來可以手工完成,因爲它是在你鏈接的文章中寫入的 - 設置「wantClientAuth(true)」而不是「needClientAuth」並執行「手動」驗證 - 事實上它似乎足以檢查「( (SSLSocket)套接字).getSession()。getPeerCertificates()「 - 如果客戶端未通過身份驗證,它將引發異常javax.net.ssl.SSLPeerUnverifiedException,這足以丟棄連接或返回有意義的內容。 –