オフィスネットワークからの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はディレクトリコンテキストにあるべきではないことに注意してください。
ディレクトリごとのコンテキストでは、HTTP要求が読み取られた後、HTTP応答が送信される前に、再構成されたクライアント検証レベルでSSL再ネゴシエーションを強制します。
おそらく、ネットワーク内では、サーバーは外部からアクセスした場合とは異なる(内部、プライベート)IPを持っています。
その場合、2つのvhostを設定するのが最も簡単です。1つはin.ter.nal.ip:443に、もう1つはex.ter.nal.ip:443に設定します。
外部仮想ホストでのみクライアント証明書を要求します。
これがApache2.4で機能することに驚きました。
<LocationMatch "^/some/secure/place">
<If "! -R 'xxx.xxx.xxx.xxx/32'">
SSLRequireSSL
SSLVerifyClient require
...etc
</If>
</LocationMatch>