Мне нужно разрешить доступ к моему сайту без 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>