2017-10-09 54 views
0

我已閱讀了很多關於IIS中客戶端證書身份驗證的文章,但他們主要討論Required模式的客戶端證書。在這種情況下,身份驗證完全在Web服務器端完成,並且用戶在證書丟失或無效的情況下被重定向到錯誤頁面。我需要的是將IIS配置爲檢查客戶端證書是否存在,並將結果作爲http標頭傳遞給我的後端。使用nginx或apache Web服務器可以輕鬆完成。客戶端認證可以設置爲optional。然後,Web服務器檢查證書,並將檢查結果作爲SSL_CLIENT_CERT(證書的PEM表示)和SSL_CLIENT_VERIFY(檢查結果 - SUCCESS,NONE,...)標頭傳遞給應用程序後端。因此,在後端部分,我可以讀取標題並使用這些值進行實際身份驗證 - 在數據庫中查找用戶,發出身份驗證令牌。在IIS中可以嗎?如果是,是否有任何關於如何繞過證書和檢查狀態的文檔作爲http頭文件?如何設置IIS以驗證客戶端證書並將其作爲http頭傳遞給後端?

回答

0

過了一段時間,我正在爲我的問題寫一個答案。

必須將IIS設置爲ARR擴展才能充當反向代理。然後,可以爲默認網站啓用客戶端證書身份驗證。這裏有幾個鏈接,說明如何實現它:

和幾個環節的SSL/TLS握手的非常堅實的解釋和證書一般:

基本上,應用程序請求路由(ARR)擴展,應啓用了IIS作爲一個代理。然後,您設置代理繞過路線。接下來,您需要爲IIS服務器設置有效的服務器證書,並在默認網站https綁定中使用它。證書應由CA頒發,該證書應放置在本地計算機的受信任根證書頒發機構和中級證書頒發機構中。然後,您應該在默認網站的SSL設置中要求SSL將客戶端證書設置爲等於接受。在這種情況下,連接到Web服務器的任何客戶端都將被要求提供與服務器證書相同的CA頒發的有效客戶端證書。

實際上,IIS會將Web服務器信任的根頒發者的可分辨名稱列表發送到客戶端瀏覽器。瀏覽器找到這些名稱與客戶端可信證書頒發者的交集,並查找由交叉點中的發行者頒發的有效證書。之後,用戶選擇其中一個(或者沒有),然後根據CA證書檢查選定的證書。如果證書通過檢查,則請求將被「重定向到」X-ARR-ClientCert標題中的證書的後端應用程序。可以在服務器 - >配置編輯器 - > system.webServer/proxy - > clientCertHeaderName IIS參數中更改標題的名稱。如果用戶選擇(或不具有)所需的證書,則該請求被「重定向」到沒有頭的應用後端。

似乎,SSL_CLIENT_VERIFY標頭中根本沒有必要使用檢查狀態。如果證書有效,它將被傳遞到標題中。如果缺少證書,則標題爲空。如果證書由客戶端提供,但無效,則請求失敗,根本不會「重定向」到後端應用服務器。看起來,這是一種罕見的情況,但我有一個例子。

試想,一個服務器證書是由CA頒發了專有名稱XXX,並且存在由CA與辨別名稱XXX頒發的客戶端證書YYY(客戶端計算機上),但這些CA是不相同(其中一個或兩個都是自簽名的)。在這種情況下,YYY證書出現在瀏覽器顯示的證書選擇對話框中,但證書不會針對真實Web服務器CA傳遞進一步的驗證。

就是這樣。此外,似乎IIS沒有辦法僅爲某些應用程序端點(地址)要求(或接受)客戶端證書。除了啓用整個網站之外,我還沒有發現任何其他選擇。