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

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

您还可以将 SSL 与“相互身份验证”一起使用。然后,服务器从客户端请求有效证书作为 SSL 握手的一部分。 服务器通过检查客户端的证书是否由可接受的颁发机构签名来对客户端进行身份验证。 例如,如果您使用 Tomcat,则应阅读 Tomcat SSL 说明。 在使用 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=Jimi Hendrix, OU=...“,这将给出一个用户名”Jimi Hendrix“。 匹配项不区分大小写。 所以“emailAddress=(.*?)”匹配“EMAILADDRESS=[email protected],CN=...“,并给出用户名”[email protected]“。 如果客户端提供证书并成功提取有效用户名,则安全上下文中应存在有效对象。 如果未找到证书或找不到相应的用户,则安全上下文将保持为空。 这意味着您可以将 X.509 身份验证与其他选项(如基于表单的登录)一起使用。subject-principal-regexCN=(.*?)AuthenticationSpring中文文档

在 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中文文档