集成 X.509 认证
1. 前言
X.509 通常用于 SSL 证书,浏览器自动检查服务端的证书是否真实,服务器是否可信。在一些情况下,服务端也会要求浏览器的证书,实现双向认证,在这种情况下,Spring Security 在安全过滤器中获得用户信息,并校验其权限是否满足。
本节重点讨论 Spring Security 与 X.509 认证的集成。
2. X.509 认证概述
X.509 其实是一种证书的格式规范,它主要包含了以下信息:
版本号
序列号
签名算法
颁发者
证书有效期(开始日期,终止日期)
主题
主题公钥信息(公钥算法,主体公钥)
颁发者唯一身份信息(可选)
主题唯一身份信息(可选)
扩展信息(可选)
签名
这个证书经过加密后变成了一种身份标识,用来使通信双方彼此信任。
我们常见的 SSL 证书就是 X.509 证书的一种表现形式。
SSL 是对 HTTP 通讯协议进行加密通讯的方法,SSL 和 HTTP 的结合也就是常见的 HTTPS 了。
3. Spring Security 集成
3.1 在 Spring Security 开启 X.509 客户端认证
要在 Spring Security 项目中开启 X.509 认证,只需要在 Http 的配置项中加入 x509,具体写法如下:
<http>
...
<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>
该对象有两个可选配置项:
subject-principal-regex
,这是一个正则表达式,用户来证书中解析出用户名,其默认值为CN=(.*?),
,解析出的用户名值将会传给UserDetailsService
用来获得用户权限;user-service-ref
,该对象用来指定UserDetailsService
实例,如果当前上下文只有一个UserDetailsService
实例时,不需要指定此对象。
3.2 在 Tomcat 中配置 SSL
3.2.1 生成 SSL 证书
这里的证书包含服务端证书和客户端证书。
服务端证书用于配置 Tomcat,使浏览器验证服务器的真实性。客户端证书需要安装到用户浏览器中,用来开启 SSL 客户端认证。
服务端配置方式如下:
<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
也同样可以置为 true
,此时客户端如果不提供 X.509 认证平局,则其不会被授权访问 Spring Security 资源。
4. 小结
本节主要内容如下:
- X.509 是一种证书格式规范;
- HTTPS 是 X.509 在 HTTP 安全上的应用;
- Spring Security 支持开启 Web 客户端的证书认证集成功能。
至此,关于 Spring Security 的认证部分就结束了,下节开始,我们讨论 Spring Security 的第二大功能「鉴权」。