FF 中的選擇客戶端證書對話框僅顯示可用客戶端證書的子集
問題:
我們這裡有一個使用客戶端證書身份驗證的應用程序。多年來,這一直沒有任何問題,但現在有幾個客戶端在 FF 和 Chrome 中遇到以下問題,但在 IE 中(還沒有):“選擇客戶端證書”對話框不再出現,因此它們被重定向到使用者名/密碼登錄頁面。所以我假設,瀏覽器不會將安裝的客戶端證書辨識為適合伺服器發送的 CA 名稱。
我檢查了什麼:
- 沒有證書(伺服器或客戶端)已過期。
- nginx 正在向客戶端發送正確的 CA 名稱。我檢查了使用 openssl s_client ….
- 我已閱讀 FF 更改日誌以找到任何聽起來與客戶端證書相關的內容,但到目前為止還沒有任何內容可以解釋此問題
我試過的:
- 我從 nginx 配置中刪除了“ssl_client_certificate”和“ssl_verify_depth”,瀏覽器中的選擇客戶端對話框再次出現,只是這次顯示了所有已安裝的證書,包括我們應用程序的證書。選擇正確的證書後,登錄成功,應用程序正常執行。
這使我得出結論,發送給客戶端的 CA 名稱可能是錯誤的,而證書本身是可以的。 2. 正如我之前提到的,並非所有客戶端都遇到此問題,因此我在測試機器上安裝了來自工作客戶端的客戶端證書和來自非工作客戶端的客戶端證書。我應該注意,這兩個證書都是由同一個 CA 頒發的(工作證書只是幾個月前)。猜猜看:當我嘗試訪問應用程序時,會出現“選擇證書”對話框,但它只顯示一個證書(來自工作客戶端的證書)。如果我再次從 nginx 配置中刪除“ssl_client_certificate”指令,我可以選擇(並成功登錄)這兩個證書中的任何一個。這與 (1.) 相比,其中一個證書似乎存在問題
現在我能做的就是引用薩姆納-米勒先生的話:“為什麼會這樣?”
我希望,以前有人遇到過類似的問題,因為我唯一的其他選擇是深入研究 FF 的原始碼,看看如何建構合適的客戶端證書列表。該客戶端證書對話框的行為最近必須更改,所以我接下來要做的是在我的測試機器上降級 FF,直到它再次工作。
環境:
伺服器:centOS 7,nginx 1.19.0,openssl 1.1.1f
客戶端:Ubuntu 19.10 上的 Firefox 77、Chrome 83 和多個版本的 Windows
nginx配置:
ssl_verify_client optional_no_ca; ssl_client_certificate /etc/ssl/certs/waf_client_ca.pem; ssl_verify_depth 2;
筆記:
- 之所以存在“optional_no_ca”,是因為出於“歷史原因”,客戶端證書的驗證是在 nginx 之外處理的。如果我將其設置為“是”或“可選”,瀏覽器行為不會改變。
- 如果我必須更換所有這些證書,那將是非常糟糕的,所以是的:我已經考慮過設置一個全新的 CA 並為所有客戶頒發新證書,但是有成千上萬的證書,所以我真的盡量避免這種情況。至少在我確切地知道至少一些現有的有什麼問題之前。
好的,在深入研究了 FF 資源並在資訊安全方面進行了更多搜尋後,我找到了解決方案:
在https://security.stackexchange.com/questions/68491/recommended-key-usage-for-a-client-certificate philippe lhardy 上描述了 libnss 執行的證書檢查以及必須滿足的標準:
- EKU 和 KU 未設置。
- KU 未設置且 EKU 設置為 clientAuth 且證書不是 CA。
- KU 包含 digitalSignature 並且 EKU 未設置
- KU 包含 digitalSignature 並且 EKU 設置為 clientAuth 並且 cert 不是 CA。
這篇文章來自 2015 年,似乎不再完全正確,因為 EKU 必須設置為 clientAuth,否則證書不會顯示在對話框中。僅僅設置 KU 欄位是不夠的。這有點奇怪,因為如果伺服器不傳輸任何 CA 名稱,似乎不會執行此檢查……也許有人知道並可以解釋為什麼會這樣。