Apache-2.2

如何讓 apache 請求客戶端 SSL 證書,而無需針對已知 CA 進行驗證?

  • April 22, 2012

我正在使用 apache2 (2.2.3) 為我希望讓客戶端使用證書進行身份驗證的站點提供服務。由於我只需要驗證提供特定證書的使用者是否與過去提供該證書的使用者相同,因此簽署證書的 CA 是無關緊要的。不過,似乎使用SSLVerifyClient requirerequires SSLCACertificateFile ...(或SSLCACertificatePath ...),然後 apache 將只接受由該文件/路徑中的 CA 簽名的證書。有沒有辦法讓 apache 接受任何客戶端證書,而不管發行/唱歌的 CA 是什麼?(即驗證客戶端是否具有與提供的公鑰對應的私鑰,但不打擾驗證頒發/簽名 CA)

如您所見,您可以使用SSLVerifyCLient optional_no_ca.

您將要面對的第二個問題是讓客戶端發送證書。由於您的證書不打算在 PKI 中,因此它們可以是自簽名的並且有不同的頒發者。

當請求客戶端證書時,伺服器會在握手期間向客戶端發送一條CertificateRequestTLS 消息。此消息包含certificate_authorities列表:

可接受的證書頒發機構的可分辨名稱列表。這些專有名稱可以為根 CA 或從屬 CA 指定所需的專有名稱;因此,該消息可用於描述已知的根和所需的授權空間。如果 certificate_authorities 列表為空,則客戶端可以發送任何適當的 ClientCertificateType 證書,除非有一些相反的外部安排。

瀏覽器使用它來選擇要發送的客戶端證書(如果有)。

(請注意,關於空列表的部分僅在 TLS 1.1 以後的規範中。SSL 3.0 和 TLS 1.0 對此保持沉默,實際上,它也可以工作。)

為此,您有兩種選擇。

  • 如果您期望的客戶端證書將是自簽名的,那麼它們都將具有不同的頒發者。因為您不知道會發生什麼,所以伺服器需要發送一個空列表。為此,請使用該SSLCADNRequestFile指令並將其指向一個僅包含空行的文件(如果我沒記錯的話,它不適用於完全空的文件)。
  • 第二個(不太乾淨)選項。是就您期望的所有客戶端證書通用的頒發者 DN 達成一致,無論它們是否確實由該 CA 證書頒發(或者該 CA 是否存在)。通過這樣做,您將大大(更多)打破 PKI 模型。

如果您同意頒發者 DN,例如CN=Dummy CA(例如)。CN=Dummy CA任何人都可以使用主題 DN(和頒發者 DN)建構自簽名證書,可能使用不同的密鑰。儘管該SSLCADNRequestFile指令希望配置證書來建構列表,但這些證書根本不用於驗證客戶端證書,它只是配置certificate_authorities列表的一種複雜(但在其他指令的上下文中很自然)的方式。如果您作為服務將具有這些名稱的自簽名證書放入 中SSLCADNRequestFile,這將使CertificateRequestTLS 消息CN=Dummy CAcertificate_authorities列表中使用(這些只是名稱,現階段不是證書)。然後,客戶端將能夠使用頒發者 DN 獲取自己的證書CN=Dummy CA,是否可以通過該證書(相同的密鑰)驗證其簽名,因為無論如何這些步驟中不涉及簽名驗證。

話雖如此,請記住,使用,不會進行真正的證書驗證(如果您的手動驗證只是您已配置的 PKI 的備份解決方案,SSLVerifyCLient optional_no_ca我想您可以檢查變數)。SSL_CLIENT_VERIFY在那個階段你會知道的是,客戶端擁有它所提供的公鑰證書的私鑰(由 TLSCertificateVerify消息保證):如果你希望對某些人進行身份驗證,則需要執行某種形式的驗證種類。(您不能信任證書的任何內容,即其公鑰與其包含的名稱/屬性之間的任何綁定。)

這不適用於文件,但您可以為應用程序執行此操作(例如 PHP/CGI/…即使是 Java,如果您將證書傳遞給代理的 Java 伺服器)。一種基本方法是擁有一個預先知道的公鑰列表,或者您可以查看FOAF+SSL/WebID中的想法。

引用自:https://serverfault.com/questions/381880