|
对于最新的稳定版本,请使用 Spring Security 7.0.4! |
X.509 认证
X.509 证书认证最常见的用途是在使用 SSL 时验证服务器的身份,最常见的情况是浏览器通过 HTTPS 访问网站时。 浏览器会自动检查服务器提供的证书是否由其内置的受信任证书颁发机构列表中的某一个机构签发(数字签名)。
你也可以在SSL中使用“双向认证”(mutual authentication)。在这种情况下,服务器会在SSL握手过程中向客户端请求一个有效的证书。 服务器通过验证客户端证书是否由受信任的权威机构签发来对客户端进行身份认证。 如果客户端提供了有效的证书,应用程序可以通过Servlet API获取该证书。 例如,如果你使用的是Tomcat,应阅读Tomcat SSL配置说明。 在尝试将其与Spring Security集成之前,请先确保上述配置能够正常工作。
Spring Security X.509模块通过使用一个过滤器来提取证书。 它将证书映射到应用程序用户,并加载该用户的授权集合以与标准的Spring Security基础设施一起使用。
为您的 Web 应用程序添加 X.509 身份验证
启用X.509客户端身份验证非常简单。
要实现这一点,请将<x509/>元素添加到您的http安全命名空间配置中:
<http>
...
<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>
元素有两个可选属性:
-
subject-principal-regex. 该正则表达式用于从证书的主题名称中提取用户名。 默认值如前面的列表所示。 这是传递给UserDetailsService以加载用户权限的用户名。 -
user-service-ref. 这是与X.509一起使用的bean的ID。 如果您的应用上下文中只有一个定义,则不需要此配置。
subject-principal-regex 应包含一个组。
例如,默认表达式(CN=(.*?))匹配通用名称字段。
因此,如果证书中的主题名称为 "CN=Jimi Hendrix, OU=…",则生成的用户名为 "Jimi Hendrix"。
匹配过程不区分大小写。
因此,"emailAddress=(.*?)," 可匹配 "EMAILADDRESS=[email protected],CN=…",生成用户名 "[email protected]"。
如果客户端提供了证书且成功提取了有效的用户名,则安全上下文中应存在一个有效的 Authentication 对象。
如果未找到证书或无法找到对应用户,则安全上下文保持为空。
这意味着您可以将 X.509 认证与其他选项(如基于表单的登录)结合使用。
在 Tomcat 中配置 SSL
Spring Security 示例仓库中提供了一些预生成的证书。
如果你不想自己生成证书,可以使用这些证书来启用 SSL 进行测试。
server.jks 文件包含服务器证书、私钥以及颁发机构证书。
此外,还有一些用于示例应用程序中用户的客户端证书文件。
你可以将这些证书安装到浏览器中,以启用 SSL 客户端认证。
要让 Tomcat 支持 SSL,将 server.jks 文件放入 Tomcat 的 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"
/>
如果即使客户端未提供证书,您仍希望 SSL 连接能够成功,也可以将 clientAuth 设置为 want。
未提供证书的客户端将无法访问任何由 Spring Security 保护的对象,除非您使用了非 X.509 的身份验证机制,例如表单身份验证。