web-dev-qa-db-ja.com

証明書クライアント認証なしで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>
5
John

これが私がそれを実装した方法です(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再ネゴシエーションを強制します。

10
John

おそらく、ネットワーク内では、サーバーは外部からアクセスした場合とは異なる(内部、プライベート)IPを持っています。

その場合、2つのvhostを設定するのが最も簡単です。1つはin.ter.nal.ip:443に、もう1つはex.ter.nal.ip:443に設定します。

外部仮想ホストでのみクライアント証明書を要求します。

1
adaptr

これがApache2.4で機能することに驚きました。

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