集成 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 的第二大功能「鉴权」。