X.509 身份验证
X.509 证书身份验证最常见的用途是在使用 SSL 时验证服务器的身份,最常见的是在从浏览器使用 HTTPS 时。 浏览器会自动检查服务器提供的证书是否已由它维护的受信任证书颁发机构列表之一颁发(数字签名)。
您还可以将 SSL 与“相互身份验证”一起使用。然后,服务器向客户端请求有效证书,作为 SSL 握手的一部分。 服务器通过检查其证书是否由可接受的颁发机构签名来验证客户端。 如果提供了有效的证书,则可以通过应用程序中的 servlet API 获取该证书。 例如,如果您使用 Tomcat,则应阅读 Tomcat SSL 说明。 在尝试使用 Spring Security 之前,您应该先让它工作。
Spring Security X.509 模块使用过滤器提取证书。 它将证书映射到应用程序用户,并加载该用户授予的权限集以用于标准 Spring Security 基础架构。
将 X.509 身份验证添加到 Web 应用程序
启用 X.509 客户端身份验证非常简单。
为此,请添加<x509/>
元素添加到您的 HTTP 安全命名空间配置中:
<http>
...
<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>
该元素有两个可选属性:
-
subject-principal-regex
. 用于从证书的使用者名称中提取用户名的正则表达式。 默认值如上表所示。 这是传递给UserDetailsService
为用户加载权限。 -
user-service-ref
. 这是UserDetailsService
与 X.509 一起使用。 如果应用程序上下文中仅定义了一个,则不需要它。
这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,可以使用这些来启用 SSL 进行测试。
这server.jks
文件包含服务器证书、私有密钥和颁发机构证书。
示例应用程序中还有一些用户的客户端证书文件。
您可以在浏览器中安装这些以启用 SSL 客户端身份验证。
要运行支持 SSL 的 tomcat,请删除server.jks
文件放入 Tomcatconf
目录,并将以下连接器添加到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
也可以设置为want
如果即使客户端未提供证书,您仍然希望 SSL 连接成功。
除非您使用非 X.509 身份验证机制(例如表单身份验证),否则未提供证书的客户端无法访问受 Spring Security 保护的任何对象。