对于最新的稳定版本,请使用 Spring Security 6.5.3spring-doc.cadn.net.cn

X.509 身份验证

概述

X.509 证书身份验证最常见的用途是在使用 SSL 时验证服务器的身份,最常见的是在从浏览器使用 HTTPS 时。 浏览器将自动检查服务器提供的证书是否由其维护的受信任证书颁发机构列表之一颁发(即数字签名)。spring-doc.cadn.net.cn

您还可以将 SSL 与“相互身份验证”一起使用;然后,服务器将向客户端请求有效证书,作为 SSL 握手的一部分。 服务器将通过检查其证书是否由可接受的机构签名来验证客户端。 如果提供了有效的证书,则可以通过应用程序中的 servlet API 获取该证书。 Spring Security X.509 模块使用过滤器提取证书。 它将证书映射到应用程序用户,并加载该用户授予的权限集以用于标准 Spring Security 基础架构。spring-doc.cadn.net.cn

在尝试将 Servlet 容器与 Spring Security 一起使用之前,您应该熟悉使用证书并为 Servlet 容器设置客户端身份验证。 大部分工作是创建和安装合适的证书和密钥。 例如,如果您使用的是 Tomcat,请阅读此处的说明 https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html。 在尝试使用 Spring Security 之前,让它正常工作很重要spring-doc.cadn.net.cn

将 X.509 身份验证添加到 Web 应用程序

启用 X.509 客户端身份验证非常简单。 只需将<x509/>元素添加到您的 HTTP 安全命名空间配置中。spring-doc.cadn.net.cn

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

该元素有两个可选属性:spring-doc.cadn.net.cn

  • subject-principal-regex. 用于从证书的使用者名称中提取用户名的正则表达式。 默认值如上所示。 这是将传递给UserDetailsService为用户加载权限。spring-doc.cadn.net.cn

  • user-service-ref. 这是UserDetailsService与 X.509 一起使用。 如果在应用程序上下文中只定义了一个,则不需要它。spring-doc.cadn.net.cn

subject-principal-regex应包含单个组。 例如,默认表达式“CN=(.*?)”与公用名字段匹配。 因此,如果证书中的使用者名称是“CN=Jimi Hendrix, OU=...“,这将给出一个用户名”Jimi Hendrix“。 匹配项不区分大小写。 因此,“emailAddress=(.*?)”将匹配“EMAILADDRESS=[email protected],CN=...“ 给出一个用户名”[email protected]“。 如果客户端提供证书并成功提取有效的用户名,则应该有一个有效的Authentication对象。 如果未找到证书,或者找不到相应的用户,则安全上下文将保持为空。 这意味着您可以轻松地将 X.509 身份验证与其他选项(例如基于表单的登录)一起使用。spring-doc.cadn.net.cn

在 Tomcat 中设置 SSL

Spring Security Samples 存储库中有一些预生成的证书。 如果您不想生成自己的 SSL,您可以使用这些来启用 SSL 进行测试。 文件server.jks包含服务器证书、私钥和颁发证书颁发机构证书。 示例应用程序中还有一些用户的客户端证书文件。 您可以在浏览器中安装这些以启用 SSL 客户端身份验证。spring-doc.cadn.net.cn

要运行支持 SSL 的 tomcat,请删除server.jks文件放入 Tomcatconf目录,并将以下连接器添加到server.xml文件spring-doc.cadn.net.cn

<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"
/>

clientAuth也可以设置为want如果即使客户端未提供证书,仍希望 SSL 连接成功。 除非您使用非 X.509 身份验证机制(例如表单身份验证),否则不提供证书的客户端将无法访问受 Spring Security 保护的任何对象。spring-doc.cadn.net.cn