Apache-2.2

SSLVerifyDepth 解釋

  • August 16, 2019

是否有全面的解釋證書鏈驗證在 apache httpd 中究竟是如何工作的,以及 SSLVerifyDepth 參數究竟是如何影響它的?可能是虛擬碼。

大多數參考文獻只是隨便提及它。

根據我的測試(請參閱此評論)和此答案,apache 中的證書鏈驗證如下所示:

current_certificate := client_certificate_from_request
current_depth := 0
LOOP
 if current_certificate IS self-signed (ie. root)
   if current_certificate IS IN SSLCACertificateFile
     THEN RETURN true // cert is accepted as valid
     ELSE RETURN false // validation failed
   end if
 end if

 current_certificate := current_certificate.getIssuer()
 current_depth += 1
 if current_depth > SSLVerifyDepth
   THEN RETURN false // validation failed
END LOOP // repeat

用一句話來說:

最終的根證書必須在 SSLCACertificateFile 中(或者在 SSLCACertificatePath 中),否則客戶端證書無效。SSLVerifyDepth 參數限制了鏈將 apache 看起來多遠。如果達到限制,則拒絕證書。

SSLCACertificateFile 中列出的中間證書僅影響建構鏈(例如,當客戶端未發送完整鏈時,因此如果沒有 SSLCACertificateFile 中列出的那些,apache httpd 將無法到達根證書),但有效性僅取決於SSLCACertificateFile 中是否存在根證書。

https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslverifydepth

…深度實際上是中間證書頒發者的最大數量,即在驗證客戶端證書時允許遵循的最大 CA 證書的數量。

深度 0 表示僅接受自簽名客戶端證書,

預設深度 1 表示客戶端證書可以自簽名或必須由伺服器直接知道的 CA 簽名(即 CA 的證書是SSLCACertificatePath 下)等。

深度為 2 意味著由(單級)中間 CA 簽名的證書被接受,即由中間 CA,其 CA 證書由伺服器直接知道的 CA 簽名。

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