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 驗證新增至您的網路應用程式

啟用 X.509 用戶端驗證非常簡單。若要執行此操作,請將 <x509/> 元素新增至您的 http security 命名空間組態

<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 Samples 儲存庫中有一些預先產生的憑證。如果您不想產生自己的憑證,可以使用這些憑證來啟用 SSL 進行測試。server.jks 檔案包含伺服器憑證、私鑰和發行授權單位憑證。還有一些用於範例應用程式使用者的用戶端憑證檔案。您可以將這些憑證安裝到您的瀏覽器中,以啟用 SSL 用戶端驗證。

若要使用 SSL 支援執行 Tomcat,請將 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 驗證機制,例如表單驗證。