Назад | Перейти на главную страницу

Разрешение входа пользователей с IP-адреса без аутентификации клиента сертификата

Мне нужно разрешить доступ к моему сайту без SSL-сертификатов из моей офисной сети и с SSL-сертификатами снаружи.

Вот моя конфигурация:

 <Directory /srv/www>
  AllowOverride All

  Order deny,allow
  Deny from all
  # office network static IP
  Allow from xxx.xxx.xxx.xxx

  SSLVerifyClient require
  SSLOptions +FakeBasicAuth
  AuthName "My secure area"
  AuthType Basic
  AuthUserFile /etc/httpd/ssl/index
  Require valid-user
  Satisfy Any

 </Directory>

Когда я внутри сети и у меня есть сертификат - я могу получить доступ. Когда я внутри сети и у меня нет сертификата - у меня нет доступа, требуется сертификат.

Когда я за пределами сети и у меня есть сертификат - я не могу получить доступ, он показывает мне основной экран входа в систему. Когда я вне сети и не имею сертификата - я не могу получить доступ, он показывает мне основной экран входа в систему.

и следующая конфигурация отлично работает

 <Directory /srv/www>
  AllowOverride All

  Order deny,allow
  Deny from all
  Allow from xxx.xxx.xxx.xxx

  AuthUserFile /srv/www/htpasswd
  AuthName "Restricted Access"
  AuthType Basic
  Require valid-user
  Satisfy Any

 </Directory>

Вот как я это реализовал (xxx.xxx.xxx.xxx - разрешить доступ для этого адреса без сертификата):

  SSLVerifyClient optional
  SSLOptions -FakeBasicAuth +StrictRequire -StdEnvVars -ExportCertData
  SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128

  RewriteEngine on
  RewriteCond %{SSL:SSL_CLIENT_VERIFY} !^SUCCESS$
  RewriteCond %{REMOTE_ADDR} !^xxx.xxx.xxx.xxx$
  RewriteRule   ^  -  [F]

Обратите внимание, что SSLVerifyClient НЕ должен находиться в контексте каталога:

В контексте каталога он вызывает повторное согласование SSL с перенастроенным уровнем проверки клиента после чтения HTTP-запроса, но до отправки HTTP-ответа.

Предположительно, внутри вашей сети сервер имеет другой (внутренний, частный) IP-адрес, чем при доступе извне.

В этом случае проще всего настроить два хоста: один на in.ter.nal.ip: 443, а другой на ex.ter.nal.ip: 443.

Требовать клиентские сертификаты только на внешнем виртуальном хосте.

Я был удивлен, обнаружив, что это работает в Apache 2.4:

<LocationMatch "^/some/secure/place">
    <If "! -R 'xxx.xxx.xxx.xxx/32'">
            SSLRequireSSL
            SSLVerifyClient require
            ...etc
    </If>
</LocationMatch>