
В целях безопасности аутентификация веб-приложения должна быть перенесена на клиентские сертификаты SSL. Должна быть возможность входа с помощью имени пользователя/пароля или SSL. Кроме того, пользователи из интрасети должны иметь возможность использовать приложение без дополнительной аутентификации.
Мы попытались реализовать этот сценарий согласно официальной документации, но безуспешно.
Вот наша текущая конфигурация
<Directory /opt/app/system/html>
RedirectMatch permanent ^/$ /exec/login.pl
Options -Indexes +FollowSymLinks
SSLVerifyClient optional
SSLVerifyDepth 2
SSLRequire %{SSL_CLIENT_I_DN_O} eq "Company_O"
SSLOptions +FakeBasicAuth
Satisfy any
AuthType Basic
AuthName "Zugriffsschutz"
AuthBasicProvider file
AuthUserFile /etc/apache2/htaccess/iapp.passwd
require valid-user
Order allow,deny
Allow from 10.20.0.0/255.255.0.0
Allow from 10.144.100
</Directory>
При такой конфигурации клиентский сертификат даже не запрашивается. Если мы удалим базовую конфигурацию аутентификации, то аутентификация клиента SSL работает хорошо.
решение1
Вопросу три месяца, поэтому мой ответ может быть не нужен автору темы, но он может быть полезен тем, кто хочет получить такую конфигурацию.
Вопрос помечен как apache-2.4, но конфигурация выглядит как подходящая для 2.2. Это не совсем удивительно, так как многие примеры в документации Apache 2.4 сами по себе не подходят для 2.4.
У меня была такая конфигурация, работающая в 2.2 (за исключением «Allow from», которая не работала), и мне пришлось переписать ее для 2.4. Я обнаружил, что ей нужны некоторые элементы, которые не были сразу очевидны в документации.
Я не даю на это никаких гарантий; это основано на моем файле конфигурации без тестирования. +StrictRequire
Возможно, это не нужно SSLOptions
— я не пробовал без этого, но это работает таким образом.
В этом случае SSLOptions
строка может вообще не потребоваться — эта +FakeBasicAuth
опция, вероятно, не используется. В конфигурации, которую я здесь имею, как только Company_O
она будет найдена в сертификате, доступ будет предоставлен. Насколько я понимаю, +FakeBasicAuth
используется с Require valid-user
(отдельно) и доступ предоставляется, если DN из сертификата найден в списке пользователей, определенном в AuthUserFile
, вместе с соответствующим паролем. Моя система так не работает, и я подозреваю, что OP тоже не хотел этого делать.
<Directory /opt/app/system/html>
RedirectMatch permanent ^/$ /exec/login.pl
Options -Indexes +FollowSymLinks
# Anything which matches a Require rule will let us in
# Make server ask for client certificate, but not insist on it
SSLVerifyClient optional
SSLVerifyDepth 2
SSLOptions +FakeBasicAuth +StrictRequire
# Client with appropriate client certificate is OK
<RequireAll>
Require ssl-verify-client
# Correction: eq is integer comparison, string comparison requires ==
# Require expr %{SSL_CLIENT_I_DN_O} eq "Company_O"
Require expr %{SSL_CLIENT_I_DN_O} == "Company_O"
</RequireAll>
# Set up basic (username/password) authentication
AuthType Basic
AuthName "Zugriffsschutz"
AuthBasicProvider file
AuthUserFile /etc/apache2/htaccess/iapp.passwd
# User which is acceptable to basic authentication is OK
Require valid-user
# Access from these addresses is OK
Require ip 10.20.0.0/255.255.0.0
Require ip 10.144.100
</Directory>
я должен
<Directory />
...
Require all denied
...
</Directory>
в другом файле конфигурации — возможно, это важная часть рецепта.
Мне потребовалось некоторое время, чтобы заставить это работать, так как казалось, что бит Require expr %{SSL_CLIENT
будет работать сам по себе, но в конце концов я понял, что это Require ssl-verify-client
также необходимо (см.http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#authzproviders)
решение2
Я нашел ответ @yitzchok-lavi очень полезным, но если (как и я) вы хотите избежать всплывающего окна базовой аутентификации, которое появляется для клиентов за пределами вашей сети и без клиентского сертификата, директива Require valid-user
должна быть внутри RequireAll
раздела. Кроме того, вопрос OP предполагает, что это уже присутствовало где-то ese в их конфигурации, но для полноты, если кто-то наткнется на этот вопрос, также SSLCACertificateFile
необходима директива (чтобы определить, какие клиентские сертификаты CA будут проверяться).
Фрагмент конфигурации, который я использую:
<Directory /opt/app/system/html>
RedirectMatch permanent ^/$ /exec/login.pl
Options -Indexes +FollowSymLinks
# Anything which matches a Require rule will let us in
# Make server ask for client certificate, but not insist on it
SSLVerifyClient optional
SSLVerifyDepth 2
SSLOptions +FakeBasicAuth +StrictRequire
# client certs will be verified against this CA
SSLCACertificateFile /etc/apache2/ssl/iapp-ca.pem
# Client with appropriate client certificate is OK
<RequireAll>
Require ssl-verify-client
Require expr %{SSL_CLIENT_I_DN_O} == "Company_O"
# User which is acceptable to basic authentication is OK
Require valid-user
</RequireAll>
# Set up basic (username/password) authentication
AuthType Basic
AuthName "Zugriffsschutz"
AuthBasicProvider file
AuthUserFile /etc/apache2/htaccess/iapp.passwd
# Access from these addresses is OK
Require ip 10.20.0.0/255.255.0.0
Require ip 10.144.100
</Directory>