X.509 身份驗證

X.509 證書身份驗證最常見的用途是在使用 SSL 時驗證伺服器的身份,尤其是在瀏覽器中使用 HTTPS 時。瀏覽器會自動檢查伺服器提供的證書是否由其維護的可信證書頒發機構列表中的一個頒發(數字簽名)。

您也可以將 SSL 與“相互身份驗證”一起使用。然後,伺服器作為 SSL 握手的一部分向客戶端請求有效的證書。伺服器透過檢查客戶端證書是否由可接受的機構簽名來驗證客戶端。如果提供了有效的證書,則可以透過應用程式中的 servlet API 獲取該證書。Spring Security X.509 模組透過使用過濾器來提取證書。它將證書對映到應用程式使用者,並載入該使用者的授權許可權集,以便與標準的 Spring Security 基礎設施一起使用。

您也可以將 SSL 與“相互身份驗證”一起使用。然後,伺服器作為 SSL 握手的一部分向客戶端請求有效的證書。伺服器透過檢查客戶端證書是否由可接受的機構簽名來驗證客戶端。例如,如果您使用 Tomcat,則應閱讀 Tomcat SSL 說明。在使用 Spring Security 嘗試之前,應先確保此功能正常工作。

將 X.509 身份驗證新增到 Web 應用

啟用 X.509 客戶端身份驗證非常簡單。為此,請將 <x509/> 元素新增到您的 http 安全名稱空間配置中

<http>
...
	<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>

該元素有兩個可選屬性

  • subject-principal-regex。用於從證書的主體名稱中提取使用者名稱的正則表示式。預設值如前所示。這是傳遞給 UserDetailsService 以載入使用者許可權的使用者名稱。

  • user-service-ref。這是要與 X.509 一起使用的 UserDetailsService 的 bean ID。如果您的應用程式上下文中只定義了一個,則不需要此屬性。

subject-principal-regex 應包含一個捕獲組。例如,預設表示式 (CN=(.*?)) 匹配通用名稱欄位。因此,如果證書中的主體名稱是 "CN=Jimi Hendrix, OU=…​",則使用者名稱為 "Jimi Hendrix"。匹配是大小寫不敏感的。因此 "emailAddress=(.*?)," 匹配 "EMAILADDRESS=[email protected],CN=…​",使用者名稱為 "[email protected]"。如果客戶端提供證書併成功提取了有效的使用者名稱,則安全上下文中應有一個有效的 Authentication 物件。如果未找到證書或找不到相應的使用者,安全上下文將保持為空。這意味著您可以將 X.509 身份驗證與其他選項(例如基於表單的登入)一起使用。

在 Tomcat 中設定 SSL

Spring Security 示例倉庫 中有一些預生成的證書。如果您不想自己生成證書,可以使用這些證書來啟用 SSL 進行測試。server.jks 檔案包含伺服器證書、私鑰和頒發機構證書。還有一些示例應用程式使用者的客戶端證書檔案。您可以將這些證書安裝在瀏覽器中以啟用 SSL 客戶端身份驗證。

要在 Tomcat 中執行 SSL 支援,請將 server.jks 檔案放入 Tomcat 的 conf 目錄,並將以下聯結器新增到 server.xml 檔案中

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true"
			clientAuth="true" sslProtocol="TLS"
			keystoreFile="${catalina.home}/conf/server.jks"
			keystoreType="JKS" keystorePass="password"
			truststoreFile="${catalina.home}/conf/server.jks"
			truststoreType="JKS" truststorePass="password"
/>

如果您希望即使客戶端未提供證書,SSL 連線也能成功建立,則可以將 clientAuth 設定為 want。未提供證書的客戶端無法訪問由 Spring Security 保護的任何物件,除非您使用非 X.509 的身份驗證機制,例如表單身份驗證。