簡體   English   中英

Spring Security x.509身份驗證-根據其頒發者的證書頒發機構接受證書

[英]Spring security x.509 authentication - accept certificates based on their issuer Certificate Authority

我正在使用Spring Security 使用x.509證書進行身份驗證 ,並且僅當服務器信任庫中存在在瀏覽器密鑰庫中配置的客戶端證書時,它才有效。

目前如何運作:

  • 我已將SSL客戶端身份驗證配置為可選( server.ssl.client-auth = want ,如本文中所示
  • 我已經配置了包含所有客戶端證書的服務器信任庫。 如果客戶端提供的證書在信任庫中,則會創建相互SSL連接。
  • 當我在服務器端信任庫中存在客戶端證書時,Firefox會打開一個帶有我的客戶端證書的彈出窗口,我可以選擇該彈出窗口並建立相互SSL連接。
  • 我已經配置了Spring Security從客戶端證書的SubjectDN中提取用戶名,並根據UserDetailsS​​ervice進行檢查。 如果針對該用戶名返回了UserDetails對象,則身份驗證過程將成功完成

問題是,如果我從服務器端信任庫中刪除客戶端證書,Firefox將不再打開此彈出窗口,而僅建立單向SSL連接。 即使服務器信任庫中存在根CA證書。

我想要的是:

  • 僅將根證書頒發機構的證書存儲在服務器信任庫中
  • 當客戶端在服務器信任庫中出示由根CA頒發的證書時,允許相互SSL連接(即使服務器信任庫中不存在客戶端證書)

互聯網上的兩種資源也吸引了我。 在有關Baeldung的本教程中,它說所有客戶端證書都必須存儲在服務器信任庫中,以便X.509身份驗證起作用(這證實了我的經驗)。

您必須記住,對於應該由服務器驗證的每個用戶,都需要在配置的信任庫中安裝其自己的證書。 對於只有幾個客戶端的小型應用程序,這可能是可行的,隨着客戶端數量的增加,這可能會導致用戶進行復雜的密鑰管理。

但是,@ robinhowlett撰寫的 本教程

客戶端將在其密鑰庫中將其證書提交給服務器,服務器將使用服務器信任庫中的CA證書來驗證客戶端證書的鏈。

這基本上是我想要實現的,但無法實現。

底線:是否有人設法在服務器信任庫中存儲一個或多個根CA證書,並使用這些根CA頒發的客戶端證書通過Spring Security中的X.509相互SSL握手進行身份驗證?

我正在使用Spring Boot 1.5.2.RELEASE(spring-security-web 4.2.2.RELEASE)。 我已經使用Firefox 53測試了我的工作SSL身份驗證。

我發現了我的問題-在服務器啟動時(我是Tomcat),我正在修改信任庫(刪除客戶端證書,僅保留CA證書)。 但是,在初始化JVM時,信任存儲區保留在內存中,並且只能讀取一次( 此ServerFault帖子上的詳細信息)。 因此,Tomcat在運行時不會讀取信任庫更改。

因此答案很簡單:是的,如果信任存儲中僅存在CA證書,則在SSL握手期間,服務器會與瀏覽器進行通信,以獲取由受信任的CA頒發的客戶端證書,然后瀏覽器會提示用戶選擇證書由受信任的CA頒發的證書(如果瀏覽器密鑰庫中存在這樣的證書)。

但是,如果在服務器啟動並運行時將CA動態添加到服務器信任庫中,則不會檢測到它。 只有在服務器重新引導(並且JVM重新初始化)之后,才能識別新的CA。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM