对于最新的稳定版本,请使用 Spring Security 6.4.1! |
X.509 身份验证
概述
X.509 证书身份验证的最常见用途是在使用 SSL 时验证服务器的身份,最常见的是从浏览器使用 HTTPS。 浏览器将自动检查服务器提供的证书是否已由它维护的受信任证书颁发机构列表之一颁发(即数字签名)。
您还可以将 SSL 与 “相互身份验证” 一起使用;然后,服务器将在 SSL 握手中从客户端请求有效证书。 服务器将通过检查其证书是否由可接受的颁发机构签名来验证客户端。 如果已提供有效证书,则可以通过应用程序中的 servlet API 获取该证书。 Spring Security X.509 模块使用过滤器提取证书。 它将证书映射到应用程序用户,并加载该用户的授予权限集,以便与标准 Spring Security 基础结构一起使用。
在尝试将 Servlet 容器与 Spring Security 一起使用之前,您应该熟悉如何使用证书并为 Servlet 容器设置客户端身份验证。 大部分工作是创建和安装合适的证书和密钥。 例如,如果您使用的是 Tomcat,则 https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html 阅读此处的说明。 在尝试使用 Spring Security 之前,请务必先完成此操作
将 X.509 身份验证添加到您的 Web 应用程序
启用 X.509 客户端身份验证非常简单。
只需将元素添加到您的 http 安全命名空间配置中。<x509/>
<http>
...
<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>
该元素有两个可选属性:
-
subject-principal-regex
. 用于从证书的使用者名称中提取用户名的正则表达式。 默认值如上所示。 这是将传递给 的用户名,用于加载用户的授权。UserDetailsService
-
user-service-ref
. 这是要用于 X.509 的 bean ID。 如果您的应用程序上下文中只定义了一个,则不需要它。UserDetailsService
应包含一个组。
例如,默认表达式 “CN=(.*?),” 与公用名字段匹配。
因此,如果证书中的使用者名称为“CN=Jimi Hendrix, OU=...“,这将给出用户名 ”Jimi Hendrix”。
匹配项不区分大小写。
所以 “emailAddress=(.*?),” 将匹配 “EMAILADDRESS=[email protected],CN=...“ 给出用户名 ”[email protected]”。
如果客户端提供证书并成功提取了有效用户名,则安全上下文中应该有一个有效的对象。
如果未找到证书,或者找不到相应的用户,则安全上下文将保持为空。
这意味着您可以轻松地将 X.509 身份验证与其他选项(例如基于表单的登录)一起使用。subject-principal-regex
Authentication
在 Tomcat 中设置 SSL
Spring Security Samples 存储库中有一些预先生成的证书。
如果您不想生成自己的 SSL,可以使用这些来启用 SSL 进行测试。
该文件包含服务器证书、私有密钥和颁发证书颁发机构证书。
还有一些来自示例应用程序的用户的客户端证书文件。
您可以在浏览器中安装这些 API 以启用 SSL 客户端身份验证。server.jks
要运行支持 SSL 的 tomcat,请将文件拖放到 tomcat 目录中,并将以下连接器添加到该文件中server.jks
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"
/>
clientAuth
如果您仍希望 SSL 连接成功,即使客户端未提供证书,也可以设置为 。
除非您使用非 X.509 身份验证机制,例如表单身份验证,否则不提供证书的 Client 端将无法访问 Spring Security 保护的任何对象。want