У меня проблемы с Apache 2.2 и небольшой документацией, которую я могу найти для файл функция SSLRequire. Я пытаюсь проверить свойство электронной почты сертификата клиента в запросе, используя SSLRequire.
Следующая опция в файле httpd.conf работает хорошо:
SSLRequire %{SSL_CLIENT_S_DN_Email} in { "mail@example.com" }
но, как я могу прочитать в документации, вы можете использовать список значений для фильтра.
Цитата из официальная документация:
file
(имя файла) - эта функция принимает один строковый аргумент и расширяется до содержимого файла. Это особенно полезно для сопоставления этого содержимого с регулярным выражением и т. Д.
Итак, следуя документации, я поместил в файл httpd.conf следующее:
SSLRequire %{SSL_CLIENT_S_DN_Email} in { file("/etc/httpd/mail-list") }
Список рассылки файла содержит только одну строку с содержанием mail@example.com
(пытаясь смоделировать вариант, работающий без file
).
Но когда я пытаюсь получить доступ к своему HTTPS-серверу, я вижу в журналах следующее:
Failed expression: %{SSL_CLIENT_S_DN_Email} in { file("/etc/httpd/mail-list") }
Это сообщение обычно появляется, когда рисунок не может быть применен. Может ли кто-нибудь помочь мне здесь, как я могу использовать эту функцию?
В соответствии с эта старая ветка в списке рассылки apache-modssl, file()
считывает содержимое файла в одну строку, поэтому специальные символы (например, новые строки) в указанном файле могут нарушить SSLRequire
синтаксис.
Учитывая, что это было опубликовано первоначальным автором mod_ssl
, Я бы поверил, что эта теория верна.
Попробуйте со следующим содержанием в /etc/httpd/mail-list
:
"mail@example.com","mail@example.org","mail2@example.org"
без конечной новой строки
file () считывает содержимое файла в одну строку (как заметил М. Джессен). Однако это не означает, что вы можете использовать синтаксис выражения apache внутри этого файла. Вам нужно будет использовать регулярное выражение для поиска внутри строки, поскольку apache, похоже, не может разделить строку на основе разделителя.
В качестве обходного пути вы можете использовать AuthBasicFake и используйте указанную переменную в качестве основного имени пользователя для аутентификации вместе с обычным базовым поставщиком аутентификации.