集成 X.509 認(rèn)證
1. 前言
X.509 通常用于 SSL 證書(shū),瀏覽器自動(dòng)檢查服務(wù)端的證書(shū)是否真實(shí),服務(wù)器是否可信。在一些情況下,服務(wù)端也會(huì)要求瀏覽器的證書(shū),實(shí)現(xiàn)雙向認(rèn)證,在這種情況下,Spring Security 在安全過(guò)濾器中獲得用戶(hù)信息,并校驗(yàn)其權(quán)限是否滿(mǎn)足。
本節(jié)重點(diǎn)討論 Spring Security 與 X.509 認(rèn)證的集成。
2. X.509 認(rèn)證概述
X.509 其實(shí)是一種證書(shū)的格式規(guī)范,它主要包含了以下信息:
版本號(hào)
序列號(hào)
簽名算法
頒發(fā)者
證書(shū)有效期(開(kāi)始日期,終止日期)
主題
主題公鑰信息(公鑰算法,主體公鑰)
頒發(fā)者唯一身份信息(可選)
主題唯一身份信息(可選)
擴(kuò)展信息(可選)
簽名
這個(gè)證書(shū)經(jīng)過(guò)加密后變成了一種身份標(biāo)識(shí),用來(lái)使通信雙方彼此信任。
我們常見(jiàn)的 SSL 證書(shū)就是 X.509 證書(shū)的一種表現(xiàn)形式。
SSL 是對(duì) HTTP 通訊協(xié)議進(jìn)行加密通訊的方法,SSL 和 HTTP 的結(jié)合也就是常見(jiàn)的 HTTPS 了。
3. Spring Security 集成
3.1 在 Spring Security 開(kāi)啟 X.509 客戶(hù)端認(rèn)證
要在 Spring Security 項(xiàng)目中開(kāi)啟 X.509 認(rèn)證,只需要在 Http 的配置項(xiàng)中加入 x509,具體寫(xiě)法如下:
<http>
...
<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>
該對(duì)象有兩個(gè)可選配置項(xiàng):
subject-principal-regex
,這是一個(gè)正則表達(dá)式,用戶(hù)來(lái)證書(shū)中解析出用戶(hù)名,其默認(rèn)值為CN=(.*?),
,解析出的用戶(hù)名值將會(huì)傳給UserDetailsService
用來(lái)獲得用戶(hù)權(quán)限;user-service-ref
,該對(duì)象用來(lái)指定UserDetailsService
實(shí)例,如果當(dāng)前上下文只有一個(gè)UserDetailsService
實(shí)例時(shí),不需要指定此對(duì)象。
3.2 在 Tomcat 中配置 SSL
3.2.1 生成 SSL 證書(shū)
這里的證書(shū)包含服務(wù)端證書(shū)和客戶(hù)端證書(shū)。
服務(wù)端證書(shū)用于配置 Tomcat,使瀏覽器驗(yàn)證服務(wù)器的真實(shí)性??蛻?hù)端證書(shū)需要安裝到用戶(hù)瀏覽器中,用來(lái)開(kāi)啟 SSL 客戶(hù)端認(rèn)證。
服務(wù)端配置方式如下:
<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"
/>
即使客戶(hù)端瀏覽器不提供證書(shū),clientAuth
也同樣可以置為 true
,此時(shí)客戶(hù)端如果不提供 X.509 認(rèn)證平局,則其不會(huì)被授權(quán)訪(fǎng)問(wèn) Spring Security 資源。
4. 小結(jié)
本節(jié)主要內(nèi)容如下:
- X.509 是一種證書(shū)格式規(guī)范;
- HTTPS 是 X.509 在 HTTP 安全上的應(yīng)用;
- Spring Security 支持開(kāi)啟 Web 客戶(hù)端的證書(shū)認(rèn)證集成功能。
至此,關(guān)于 Spring Security 的認(rèn)證部分就結(jié)束了,下節(jié)開(kāi)始,我們討論 Spring Security 的第二大功能「鑒權(quán)」。