Аутентификация с помощью клиентского SSL-сертификата ИЛИ базовая аутентификация

Аутентификация с помощью клиентского SSL-сертификата ИЛИ базовая аутентификация

В целях безопасности аутентификация веб-приложения должна быть перенесена на клиентские сертификаты 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>

Связанный контент