此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.3! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.3! |
X.509 证书身份验证的最常见用途是在使用 SSL 时验证服务器的身份,最常见的是从浏览器使用 HTTPS。 浏览器会自动检查服务器提供的证书是否已由它维护的受信任证书颁发机构列表之一颁发(数字签名)。
您还可以将 SSL 与 “相互身份验证” 一起使用。然后,服务器会向客户端请求有效的证书,作为 SSL 握手的一部分。 服务器通过检查客户端的证书是否由可接受的颁发机构签名来验证客户端。 如果已提供有效证书,则可以通过应用程序中的 servlet API 获取该证书。 Spring Security X.509 模块使用过滤器提取证书。 它将证书映射到应用程序用户,并加载该用户的授予权限集,以便与标准 Spring Security 基础结构一起使用。
您还可以将 SSL 与 “相互身份验证” 一起使用。然后,服务器会向客户端请求有效的证书,作为 SSL 握手的一部分。 服务器通过检查客户端的证书是否由可接受的颁发机构签名来验证客户端。 例如,如果您使用 Tomcat,则应阅读 Tomcat SSL 说明。 在尝试使用 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=Jimi Hendrix, OU=...“,这将给出用户名 ”Jimi Hendrix”。
匹配项不区分大小写。
所以 “emailAddress=(.*?),” 匹配 “EMAILADDRESS=[email protected],CN=...“,给出用户名 ”[email protected]”。
如果客户端提供证书并成功提取了有效用户名,则安全上下文中应该有一个有效的对象。
如果未找到证书或找不到相应的用户,则安全上下文将保持为空。
这意味着您可以将 X.509 身份验证与其他选项一起使用,例如基于表单的登录。subject-principal-regex
CN=(.*?)
Authentication
在 Tomcat 中设置 SSL
Spring Security Samples 存储库中有一些预先生成的证书。
如果您不想生成自己的 SSL,则可以使用这些 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