X.509 身份验证
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 客户端身份验证非常简单。为此,请将<x509/>
元素添加到您的 http 安全命名空间配置中
<http>
...
<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>
该元素有两个可选属性
-
subject-principal-regex
。用于从证书的主题名称中提取用户名的正则表达式。默认值如上所示。这是传递给UserDetailsService
以加载用户授权的用户名称。 -
user-service-ref
。这是要与 X.509 一起使用的UserDetailsService
的 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 客户端身份验证。
要使用 SSL 支持运行 tomcat,请将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
。除非您使用非 X.509 身份验证机制(如表单身份验证),否则未提供证书的客户端无法访问 Spring Security 保护的任何对象。