对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

概述

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

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

在尝试将 servlet 容器与 Spring Security 一起使用之前,您应该熟悉使用证书和设置客户端身份验证。 大部分工作是创建和安装合适的证书和密钥。 例如,如果您使用的是 Tomcat,请阅读此处的说明 https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html。 在使用 Spring Security 试用之前,请务必先完成此操作Spring中文文档

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

启用 X.509 客户端身份验证非常简单。 只需将该元素添加到 http 安全命名空间配置中即可。<x509/>Spring中文文档

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

该元素有两个可选属性:Spring中文文档

  • subject-principal-regex. 用于从证书的使用者名称中提取用户名的正则表达式。 默认值如上所示。 这是将传递给用户以加载权限的用户名。UserDetailsServiceSpring中文文档

  • user-service-ref. 这是要与 X.509 一起使用的 Bean ID。 如果应用程序上下文中只定义了一个,则不需要它。UserDetailsServiceSpring中文文档

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

在 Tomcat 中设置 SSL

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

若要运行支持 SSL 的 tomcat,请将文件拖放到 tomcat 目录中,并将以下连接器添加到该文件中server.jksconfserver.xmlSpring中文文档

<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如果仍希望 SSL 连接成功,即使客户端未提供证书,也可以设置为。 未提供证书的客户端将无法访问受 Spring Security 保护的任何对象,除非您使用非 X.509 身份验证机制,例如表单身份验证。wantSpring中文文档