Apache-2.2
SSLVerifyDepth 解釋
是否有全面的解釋證書鏈驗證在 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 簽名。