2012-10-29 13 views
0

我已經編寫了一個servlet過濾器來爲Web應用程序添加安全性。在某些情況下,我想驗證與應用程序服務器的連接是使用雙向SSL(TLS 1.0)進行的。通常這是通過HttpServletRequest.getAttribute("javax.servlet.request.X509Certificate")完成的;但是,就我而言,在應用程序服務器前有一個反向代理,並且此代理通過WL-Proxy-Client-Cert標頭將應用程序服務器的客戶端證書傳遞給應用程序服務器。因此,當我檢索上述屬性時,我得到了最初出現在標題中的客戶端證書。我想要做的不僅是驗證客戶端證書,還要確保反向代理和應用程序服務器之間的連接通過雙向SSL進行保護。有沒有辦法讓我從servlet中進行驗證?我正在使用WebLogic 10.3.4,Java EE 5.將WebLogic SSL端口配置爲需要雙向SSL不是一種選擇,因爲同一服務器上的一些其他服務只需要單向SSL。如何從servlet驗證是否使用雙向SSL進行連接?

+0

所有的應用服務器的連接都來自反向代理嗎?如果是這樣,您*可以*在應用服務器上要求雙向SSL。從瀏覽器到代理的某些連接可能不使用雙向SSL,但可以確保從代理到應用服務器的所有連接都可以。 – Wyzard

+0

嗯,實際上有兩個反向代理(面向兩個不同的供應商):其中一個代理通過單向SSL連接,另一個通過雙向SSL連接。我提出了使用雙向SSL將兩個代理連接到應用程序服務器的想法,但這個想法尚未被接受(但)。除非必須,否則我們寧願不管理額外的SSL證書。 – vor23

回答

-1

世上本沒有客戶端證書,除非有雙向SSL認證。證書的存在就足夠證明了。

+0

事實上,我們要驗證的是_two_ X.509證書:客戶端發送的證書和代理使用的證書。因此,一旦請求到達WebLogic服務器,根據適當的請求,就會有這兩個X.509證書:客戶端在其與反向代理的SSL會話中使用的證書(由反向代理作爲HTTP頭髮送),反向代理用於反向代理和WebLogic服務器(用於與WebLogic服務器的SSL握手中)之間的SSL連接。那有意義嗎? – vor23

+0

@ vor23所以你必須看看證書才能看到它。問題仍然沒有意義。 – EJP

+0

我們希望驗證客戶端和反向代理之間的路徑以及反向代理和應用程序之間的路徑是否都通過雙向SSL進行保護。當我調用'HttpServletRequest.getAttribute(「javax.servlet.request.X509Certificate」)時,我只獲得一個證書鏈。我的問題基本上是這樣的:如何從servlet驗證反向代理是否向我發送'WL-Proxy-Client-Cert'標頭_並且通過雙向SSL連接到我? – vor23

0

檢查客戶證書是一樣的,不管客戶是否是網頁瀏覽器或反向代理。只需獲取"javax.servlet.request.X509Certificate"屬性並檢查它是否與您的反向代理(基於DN或頒發者)匹配。

WL-Proxy-Client-Cert只有當應用服務器需要知道什麼客戶端證書被提交給代理,驗證呈現給應用服務器的證書是代理的後進場。

+0

問題是有人可能會繞過反向代理,取得反向代理的X.509證書的公鑰,然後使用單向SSL連接到WebLogic服務器,並通過'WL-Proxy- Client-Cert'頭。我們已經測試了這種情況,它在愚弄應用服務器時起作用。我們希望確保這些請求被阻止,同時讓合法請求通過。 – vor23

+0

@vor因此,您只需(1)阻止使用代理證書:換言之,禁用代理和服務器之間的HTTPS,並且(2)禁止直接訪問服務器。 – EJP

+0

禁用SSL不是一種選擇,因爲我們需要加密整個通信路徑。 – vor23

0

您在過濾器中使用HttpServletRequest.getAttribute("javax.servlet.request.X509Certificate")獲得的原始請求中的內容是應用程序服務器所看到的證書:如果正在使用該證書,它將是反向代理自己的客戶端證書。

根據您的要求,你可以,如果你需要做基於此屬性的授權有關的決定。您不需要驗證您是否信任證書本身,因爲身份驗證應該由應用程序服務器的SSL連接器(使用適當的信任庫配置)完成。

這可能是因爲大部分的容器內的應用程序都將期待getAttribute("javax.servlet.request.X509Certificate")指用戶的證書,而不是代理的證書。

目前尚不清楚以哪種方式你得到你WL-Proxy-Client-Cert附加頭的價值,但我會承擔一些PEM格式。 您應該能夠轉換此內容,並將其放入過濾器中的javax.servlet.request.X509Certificate屬性中,然後再擊中其他過濾器/邏輯。這應該是代表證書鏈的java.security.cert.X509Certificate數組(首先是客戶端證書,後面是發佈者)。您可以使用CertificateFactory(請參閱示例)或BouncyCastle的PEMReader進行轉換。

您可以驗證這些證書,但我會說有這樣做毫無意義。當用戶和代理之間的連接完成時,這應該在反向代理中真正完成。如果您不信任代理服務器,它可能會向您發送任何它想要的證書:您將無法檢查用戶是否擁有來自工作節點的該證書的私鑰,只有反向代理可以執行此操作。

這是說,你肯定能利用這種方式獲得(再一次客戶端證書的授權決定,只要你信任的反向代理:出於這個原因,你必須驗證發送你的信息的一種方式或反向代理另一個)。

相關問題