簡體   English   中英

Apache客戶端認證證書

[英]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 ,我在這里總結:

  1. 與我們的討論無關的其他步驟
  2. 客戶端以“證書”消息作為響應,其中包含客戶端的證書。
  3. ClientKeyExchange步驟 ,我們可以在討論中跳過
  4. 客戶端發送一個CertificateVerify消息,該消息是使用客戶端證書的私鑰對先前握手消息進行的簽名。 可以使用客戶端證書的公共密鑰來驗證此簽名。 這使服務器知道客戶端可以訪問證書的私鑰,因此擁有證書。 因此,在這里您可以看到客戶端需要使用其私鑰進行某些操作,服務器將能夠對此進行驗證。

當然,僅當您過濾最終客戶證書時,所有這些方法才有效:如果允許其中的任何一個,則任何人都可以創建具有任何身份的證書。

配置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.

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