有没有全面的解释证书链验证在 apache httpd 中究竟是如何工作的,以及 SSLVerifyDepth 参数究竟如何影响它?可能是伪代码。
大多数参考文献只是随意提及它。
答案1
https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslverifydepth
... 深度实际上是中间证书颁发者的最大数量,即在验证客户端证书时允许遵循的最大 CA 证书数量。
深度为 0 表示仅接受自签名客户端证书,
默认深度为 1 表示客户端证书可以是自签名的,也可以由服务器直接知道的 CA 签名(即 CA 的证书位于 SSLCACertificatePath 下),等等。
深度为 2 意味着接受由(单级)中间 CA 签名的证书,即由中间 CA 接受,该中间 CA 的 CA 证书由服务器直接已知的 CA 签名。
答案2
根据我的测试(见此评论) 和这个答案,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 中是否存在根证书。