Из соображений безопасности аутентификация для веб-приложения должна быть перемещена в клиентские сертификаты 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 работает хорошо.
Вопросу три месяца назад, поэтому мой ответ может не понадобиться OP, но он может помочь любому, кому нужна такая конфигурация.
Вопрос помечен как apache-2.4, но конфигурация выглядит как подходящая для 2.2. Это не совсем удивительно, поскольку многие примеры в документации Apache 2.4 кажутся неподходящими для 2.4.
У меня была такая конфигурация, работающая в 2.2 (за исключением «Разрешить от», которая не работала), и переписать на 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
Require expr %{SSL_CLIENT_I_DN_O} eq "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- также требовался клиент
(см. http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#authzproviders )