Да, скалы Perl для этого и вот являются целым сценарием с этой целью.
Вот как я это реализовал (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-адрес, чем при доступе извне.
В этом случае было бы проще всего настроить два vhosts - один на 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>