Назад | Перейти на главную страницу

Невозможно получить цепочку сертификатов клиента от apache

Я пытаюсь получить цепочку сертификатов клиента и root от apache до моего бэкэнда Java.

Это соответствующая часть моей конфигурации apache:

  SSLOptions +StdEnvVars +ExportCertData
  RequestHeader set "SSL_CLIENT_CERT" "%{SSL_CLIENT_CERT}e"
  RequestHeader set "SSL_CLIENT_CERT_CHAIN_0" "%{SSL_CLIENT_CERT_CHAIN_0}e"
  RequestHeader set "SSL_CLIENT_ROOT_CERT" "%{SSL_CLIENT_ROOT_CERT}e"

Я могу получить сертификат клиента, но корневой и промежуточный сертификаты null. Я проверил с помощью tcpdump, что корневой и промежуточный сертификаты отправляются в apache.

Моя версия apache - 2.4.6.

Я смотрел на похожие вопросы, например
Как получить цепочку сертификатов клиента во время аутентификации сертификата с помощью Apache? SSL_CLIENT_CERT_CHAIN ​​не передается на внутренний сервер

но ответы не устранили мою проблему. Есть идеи, почему они не передаются? Спасибо.

Отвечая на мой собственный вопрос для справки.

Причина SSL_CLIENT_CERT_CHAIN_0 и SSL_CLIENT_ROOT_CERT не были переданы, потому что они извлечены из сертификатов, загруженных клиентом. Я предполагал, что они будут извлечены из доверенного хранилища, но, посмотрев на исходный код httpd, я обнаружил, что это не так.

httpd вызывает функцию openssl SSL_get_peer_cert_chain() заселить SSL_CLIENT_CERT_CHAIN_n и SSL_CLIENT_ROOT_CERT поля. Из документа openssl, https://www.openssl.org/docs/man1.1.0/man3/SSL_get_peer_cert_chain.html , функция возвращает только одноранговая цепочка, отправленная одноранговым узлом. Это было причиной того, что промежуточное звено и корень были переданы как null, поскольку в моем случае они получены из хранилища доверенных сертификатов, а не от клиента.