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
https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslverifydepth
深度为 2 意味着由(单级)中间 CA 签名的证书被接受,即由中间 CA,其 CA 证书由服务器直接知道的 CA 签名。
根据我的测试(请参阅此评论)和此答案,apache 中的证书链验证如下所示:
用一句话来说:
最终的根证书必须在 SSLCACertificateFile 中(或者在 SSLCACertificatePath 中),否则客户端证书无效。SSLVerifyDepth 参数限制了链将 apache 看起来多远。如果达到限制,则拒绝证书。
SSLCACertificateFile 中列出的中间证书仅影响构建链(例如,当客户端未发送完整链时,因此如果没有 SSLCACertificateFile 中列出的那些,apache httpd 将无法到达根证书),但有效性仅取决于SSLCACertificateFile 中是否存在根证书。