Есть ли исчерпывающее объяснение, как именно работает проверка цепочки сертификатов в 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
... Глубина на самом деле - это максимальное количество промежуточных эмитентов сертификатов, т.е. количество сертификатов УЦ, которому максимально разрешено следовать при проверке клиентского сертификата.
. Глубина 0 означает, что принимаются только самоподписанные клиентские сертификаты
. глубина по умолчанию 1 означает, что клиентский сертификат может быть самоподписанным или должен быть подписан УЦ, непосредственно знакомым с сервером (т.е. сертификат УЦ находится под SSLCACertificatePath) и т.д.
Глубина 2 означает, что сертификаты, подписанные промежуточным УЦ (одного уровня), принимаются, т.е. промежуточным УЦ, чей сертификат УЦ подписан УЦ, непосредственно знакомым с сервером.