Я все-таки повторюсь со своей проблемой.
Пытался внимательно понять, как и что работает, пришел к следующим выводам:
1. Директива ssl_client_certificate определяет список доступных CA для клиента, сертификаты этих CA сервер готов рассматривать для авторизации по сертификату. Со стороны клиента выглядит как:
---
Acceptable client certificate CA names
/CN=SubCA1/O=Test JSC/L=Moscow/C=RU
---
Браузер, получая такой сертификат смотрит все клиентские пары ключей и выбирает те, которые подписаны указанным сертификатом.
2. Директива ssl_certificate содержит ссылку на файл с серверным SSL сертификатом. Причем если в сертификате верно прописаны AIA caIssuer и Authority Key Identifier, то клиент может самостоятельно построить цепочку до корневого сертификата. Возможно добавить промежуточные CA после серверного сертификата, однако корневой сертификат добавлять туда не стоит, в этом нет смысла. Корневые сертификаты должны присутствовать у клиента.
Вроде все должно работать предсказуемо, однако это не так.
Проблемы начинаются из-за того, что нет разделения механизма проверки клиентских сертификатов и предоставления клиенту списка принимаемых сертификатов. Это приводит к тому, что в директиве ssl_client_certificate ссылка должна указывать на файл, который помимо серверного сертификата должен ВСЕГДА содержать цепочку сертификатов, включая корневой, иначе проверка клиентского сертификата завершится неудачно с кодом 20:unable to get local issuer certificate для отсутствующих сертификатов и 27:certificate not trusted для всех остальных в цепочке.
Проблема наличия корневого сертификата в списке доступных для клиента в том, что браузер предлагает использовать все сертификаты всех подчиненных CA, подписанных корневым сертификатом. Это является потенциальной проблемой безопасности. И пользователь с сертификатом, подписанным SubCA2, сможет получить доступ на сайт вместо пользователя с сертификатом, подписанным SubCA1.
Есть ли возможность реализовать передачу доступных CA клиенту директивой ssl_client_certificate в виде существующей функциональности, а вот механизм проверки клиентских сертификатов сделать независимым от данной директивы? Вероятно придется определить новый параметр типа ssl_verify_client_certificate, который будет указывать на файл с цепочками доверенных сертификатов, включая корневые.
Это действительно важно для многоуровневых PKI.
Заранее спасибо!