Я пытаюсь получить цепочку сертификатов клиента и 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, поскольку в моем случае они получены из хранилища доверенных сертификатов, а не от клиента.