我已經編寫了一個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進行連接?
回答
世上本沒有是客戶端證書,除非有雙向SSL認證。證書的存在就足夠證明了。
事實上,我們要驗證的是_two_ X.509證書:客戶端發送的證書和代理使用的證書。因此,一旦請求到達WebLogic服務器,根據適當的請求,就會有這兩個X.509證書:客戶端在其與反向代理的SSL會話中使用的證書(由反向代理作爲HTTP頭髮送),反向代理用於反向代理和WebLogic服務器(用於與WebLogic服務器的SSL握手中)之間的SSL連接。那有意義嗎? – vor23
@ vor23所以你必須看看證書才能看到它。問題仍然沒有意義。 – EJP
我們希望驗證客戶端和反向代理之間的路徑以及反向代理和應用程序之間的路徑是否都通過雙向SSL進行保護。當我調用'HttpServletRequest.getAttribute(「javax.servlet.request.X509Certificate」)時,我只獲得一個證書鏈。我的問題基本上是這樣的:如何從servlet驗證反向代理是否向我發送'WL-Proxy-Client-Cert'標頭_並且通過雙向SSL連接到我? – vor23
檢查客戶證書是一樣的,不管客戶是否是網頁瀏覽器或反向代理。只需獲取"javax.servlet.request.X509Certificate"
屬性並檢查它是否與您的反向代理(基於DN或頒發者)匹配。
的WL-Proxy-Client-Cert
只有當應用服務器需要知道什麼客戶端證書被提交給代理,驗證呈現給應用服務器的證書是代理的後進場。
您在過濾器中使用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
進行轉換。
您可以驗證這些證書,但我會說有這樣做毫無意義。當用戶和代理之間的連接完成時,這應該在反向代理中真正完成。如果您不信任代理服務器,它可能會向您發送任何它想要的證書:您將無法檢查用戶是否擁有來自工作節點的該證書的私鑰,只有反向代理可以執行此操作。
這是說,你肯定能利用這種方式獲得(再一次客戶端證書的授權決定,只要你信任的反向代理:出於這個原因,你必須驗證發送你的信息的一種方式或反向代理另一個)。
- 1. 使用證書進行雙向SSL的WCF驗證錯誤
- 2. 雙向SSL驗證
- 3. 在dotnet中使用ssl進行雙向驗證
- 4. 爲什麼不重新使用雙向ssl連接驗證的證書?
- 5. 使用AFNetworking進行SSL證書驗證
- 6. 如何與ssl證書建立雙向連接?
- 7. 如何驗證LDAP + SSL連接的服務器SSL證書
- 8. 僅使用SSL進行身份驗證
- 9. Netty中的雙向SSL身份驗證
- 10. SSL通信的雙向身份驗證
- 11. 在Android上使用客戶端/服務器證書進行雙向身份驗證SSL套接字
- 12. 如何驗證我的網站是否使用SHA256RSA SSL證書?
- 13. 使用Netty進行單向SSL身份驗證
- 14. 如何使用node.js連接到mongodb(並進行身份驗證)?
- 15. 集中傳出雙向SSL連接
- 16. 確定TCP連接是否使用SSL
- 17. 如何檢查連接是否爲SSL?
- 18. 如何驗證okhttp是否使用http/2進行請求?
- 19. 使用System.Configuration驗證器對雙精度進行驗證
- 20. 如何驗證我的SSL(https)證書是否適用於Openfire?
- 21. 如何使用使用HttpsUrlConnection的SSL連接使用代理驗證?
- 22. buildout/easy_install/setup_tools是否驗證SSL證書?
- 23. 如何在調用URI時驗證SSL連接?
- 24. Facebook連接進行簡單驗證?
- 25. 定義連接時進行驗證
- 26. 如何驗證連接是否與python requests.session重用?
- 27. 如何使用Active-Directory使用Mule ESB連接器進行身份驗證
- 28. 如何檢查連接是否使用ssl?
- 29. MongoDB自簽名SSL連接:SSL對等證書驗證失敗
- 30. 驗證iPhone是否連接到底座
所有的應用服務器的連接都來自反向代理嗎?如果是這樣,您*可以*在應用服務器上要求雙向SSL。從瀏覽器到代理的某些連接可能不使用雙向SSL,但可以確保從代理到應用服務器的所有連接都可以。 – Wyzard
嗯,實際上有兩個反向代理(面向兩個不同的供應商):其中一個代理通過單向SSL連接,另一個通過雙向SSL連接。我提出了使用雙向SSL將兩個代理連接到應用程序服務器的想法,但這個想法尚未被接受(但)。除非必須,否則我們寧願不管理額外的SSL證書。 – vor23