[英]JBoss to Spring Boot and Spring Security upgrade: X509 Authentication problems
升級自:JBoss EAP 6.4 / Spring Security 4.2.1(XML 配置)
升級到:Spring Boot 2.2.4 / Spring Security 5.2.1 (JavaConfig)
我們有一個受 Spring Security 保護的 REST 端點,它使用 X509 身份驗證和一個測試客戶端。
我在X509AuthenticationFilter.extractClientCertificate
處的Spring Security 過濾器鏈中設置X509AuthenticationFilter.extractClientCertificate
:
X509Certificate[] certs = (X509Certificate[]) request
.getAttribute("javax.servlet.request.X509Certificate");
轉到 Spring Boot 和 Spring Security 5.2 JavaConfig 后,我不再在請求中看到 X509 證書。
沒有發布源代碼,因為我不希望有人解決我的問題......我只是在尋找一些關於在哪里挖掘或可能探索的路徑的建議。 一些想法...
javax.servlet.request.X509Certificate
屬性的請求中? 我正在針對舊的(正在運行的)JBoss EAP 應用程序進行調試,但始終無法弄清楚它是如何進入請求的,只是當我在 Spring Security 的X509AuthenticationFilter
斷點時它就在那里。如果有人遇到過這個問題......我解決了它,如果它對其他人有幫助,我會很樂意回答問題。
結果證明不是 Spring Security 的問題,而是我們如何配置 Tomcat 連接器的問題。
我們需要:
使用下面與org.apache.coyote.http11.Http11NioProtocol
兼容的方法調用正確設置 Spring Boot Tomcat 安全連接器的信任庫。
另外(這是必不可少的) - 將ClientAuth設置為“true”。
這很丑陋,我挖掘了Tomcat-embed-core
的源代碼,但是有一系列字符串相當於“強制客戶端將證書作為請求的一部分發送”。 這些字符串是:“true”、“yes”、“require”、“required”。 他們都做同樣的事情,所以我們只使用“true”。
protocol.setTruststoreFile(truststorePath); // local directory path
protocol.setTruststoreType(truststoreType); // a string of either PKCS12 or JKS
protocol.setTruststorePass(truststorePass); // whatever password you set on your Keystore
protocol.setClientAuth("true"); // Makes the client provide cert in Request over HTTPS
Tomcat 連接器沒有很好的文檔記錄。 有一個方法調用:
protocol.setSSLCACertificateFile(trustStorePath);
在org.apache.coyote.http11.Http11NioProtocol
下什么都不做。
顯然,它旨在與org.apache.coyote.http11.Http11AprProtocol
(Apache 便攜式運行時)一起使用。 這對我們來說是一個紅鯡魚,我們調用了那個方法,但實際上並沒有設置我們的信任庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.