[英]Apache Client Certificates for Authentication
我想通過使用PHP / MySQL進行身份驗證的兩個因素通過API公開服務。 一個因素是簡單的用戶名和密碼。 對於另一個因素,我嘗試使用雙向TLS,其中客戶端證書與用戶名匹配。 我打算使用我在CentOS機器上與Apache一起建立的CA的自簽名證書,並通過安全通道將客戶證書和私鑰一起頒發給客戶。
我發現了一些有關如何使用SSL證書設置用戶身份驗證的不錯的文章。 我到目前為止發現的最好的是下面的。
https://cweiske.de/tagebuch/ssl-client-certificates.htm
但是,在向我解釋某些內容方面,該文章和其他文章似乎存在漏洞。 我如何設想這種工作方式是:當客戶端發出POST請求時,連同用戶名和密碼一起,還將包括帶有由數字簽名所頒發給用戶的帶有數字簽名的證書。 然后可以使用公鑰解密此簽名,以確認私鑰的所有者已發送消息。 但是,這些文章實際上並沒有確認這是正在發生的事情。
相反,他們說Apache確認證書是由CA Cert簽名的。 他們還解釋了如何使用PHP訪問證書中的字段,例如SSL_CLIENT_S_DN_Email和SSL_CLIENT_M_SERIAL,並使用它們來確認證書屬於消息的發件人。 但是,對我來說不清楚他們是否只是在使用公共證書中的信息。 因此,任何可以訪問公共證書的人都可以將其用作身份驗證因素之一,以對服務進行身份驗證。 如果是這樣,則意味着它並不是真正的認證因素。
我是否誤以為是我希望的情況-消息中包含的證書確實包含由頒發給用戶的私鑰簽名的簽名,並且Apache用公鑰解密了簽名,而不僅僅是確認證書已頒發由CA?
有兩點。
在這種情況下(通過證書進行客戶端身份驗證),服務器將維護其信任的證書列表或對這些證書進行簽名的CA。 服務器將檢查這兩種情況之一中提供的證書。
至於所提供的證書,沒有人可以提供任何證書,因為TLS交換將強制客戶端使用關聯的私鑰進行操作,因此服務器將能夠驗證客戶端確實具有公共證書的相關私鑰。呈現。
在以下網址對此進行了很好的說明: https : //en.wikipedia.org/wiki/Transport_Layer_Security#Client-authenticated_TLS_handshake ,我在這里總結:
當然,僅當您過濾最終客戶證書時,所有這些方法才有效:如果允許其中的任何一個,則任何人都可以創建具有任何身份的證書。
配置Apache以允許相互認證非常簡單,並且http://httpd.apache.org上的文檔非常清晰。 基本上,您需要兩個證書:一個服務器要安裝在Apache服務器上,然后一個客戶端要安裝在Firefox瀏覽器或客戶端應用程序或其他設備上。 客戶端證書必須由Apache服務器知道的CA之一頒發,以使身份驗證成功。
該項目https://github.com/amusarra/docker-apache-ssl-tls-mutual-authentication實現了Apache SSL / TLS相互認證的完整配置
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.