
セキュリティ上の理由から、Web アプリケーションの認証は SSL クライアント証明書に移行する必要があります。ユーザー名/パスワードまたは SSL のいずれかを使用してログインできるようにする必要があります。さらに、イントラネットのユーザーは追加の認証なしでアプリを使用できるようにする必要があります。
公式ドキュメントに従ってこのシナリオを実装しようとしましたが、成功しませんでした。
現在の設定は次のとおりです
<Directory /opt/app/system/html>
RedirectMatch permanent ^/$ /exec/login.pl
Options -Indexes +FollowSymLinks
SSLVerifyClient optional
SSLVerifyDepth 2
SSLRequire %{SSL_CLIENT_I_DN_O} eq "Company_O"
SSLOptions +FakeBasicAuth
Satisfy any
AuthType Basic
AuthName "Zugriffsschutz"
AuthBasicProvider file
AuthUserFile /etc/apache2/htaccess/iapp.passwd
require valid-user
Order allow,deny
Allow from 10.20.0.0/255.255.0.0
Allow from 10.144.100
</Directory>
この構成では、クライアント証明書は要求されません。基本認証構成を削除すると、SSL クライアント認証は正常に機能します。
答え1
この質問は 3 か月前の質問なので、私の回答は OP には必要ないかもしれませんが、この構成を希望する人には役立つかもしれません。
質問には apache-2.4 のタグが付けられていますが、設定は 2.2 に適したもののように見えます。Apache 2.4 ドキュメントの多くの例自体が 2.4 に適していないように見えるため、これはまったく驚くべきことではありません。
2.2 ではこのような構成が機能していましたが (「Allow from」は機能しませんでした)、2.4 用に書き直す必要がありました。ドキュメントではすぐには明らかにならなかったいくつかの要素が必要であることがわかりました。
これについては保証しません。これはテストなしの構成ファイルに基づいています。+StrictRequire
必要ない場合もありますSSLOptions
。これなしで試したことはありません。ただし、この方法では動作します。
実際のところ、SSLOptions
行はまったく必要ないかもしれません。オプションはおそらく使用されていないでしょう。ここでの設定では、が証明書に見つかる+FakeBasicAuth
とすぐにアクセスが許可されます。私の理解では、 は (単独で) とともに使用され、 で定義されたユーザー リストに証明書の DN が見つかり、適切なパスワードも見つかった場合にアクセスが許可されます。私のシステムはそのようには動作しませんし、OP もそのようにしたくなかったのではないかと思います。Company_O
+FakeBasicAuth
Require valid-user
AuthUserFile
<Directory /opt/app/system/html>
RedirectMatch permanent ^/$ /exec/login.pl
Options -Indexes +FollowSymLinks
# Anything which matches a Require rule will let us in
# Make server ask for client certificate, but not insist on it
SSLVerifyClient optional
SSLVerifyDepth 2
SSLOptions +FakeBasicAuth +StrictRequire
# Client with appropriate client certificate is OK
<RequireAll>
Require ssl-verify-client
# Correction: eq is integer comparison, string comparison requires ==
# Require expr %{SSL_CLIENT_I_DN_O} eq "Company_O"
Require expr %{SSL_CLIENT_I_DN_O} == "Company_O"
</RequireAll>
# Set up basic (username/password) authentication
AuthType Basic
AuthName "Zugriffsschutz"
AuthBasicProvider file
AuthUserFile /etc/apache2/htaccess/iapp.passwd
# User which is acceptable to basic authentication is OK
Require valid-user
# Access from these addresses is OK
Require ip 10.20.0.0/255.255.0.0
Require ip 10.144.100
</Directory>
私は持っています
<Directory />
...
Require all denied
...
</Directory>
別の設定ファイルでは、それがレシピの重要な部分である可能性があります。
これを動作させるのに時間がかかったのは、ビットRequire expr %{SSL_CLIENT
自体が単独で動作するように見えたが、最終的にはそれがRequire ssl-verify-client
必要であることに気付いたからだ(認証プロバイダ)
答え2
@yitzchok-lavi の回答は非常に役立ちましたが、(私のように) ネットワーク外のクライアントやクライアント証明書のないクライアントに表示される基本認証ポップアップを回避したい場合は、ディレクティブをセクションRequire valid-user
内に配置する必要がありますRequireAll
。また、OP の質問では、これがすでに構成のどこかに存在していることが示唆されていますが、完全を期すために、誰かがこの質問に遭遇した場合に備えて、ディレクティブもSSLCACertificateFile
必要です (どの CA クライアント証明書を検証するかを定義するため)。
私が使用する構成スニペット:
<Directory /opt/app/system/html>
RedirectMatch permanent ^/$ /exec/login.pl
Options -Indexes +FollowSymLinks
# Anything which matches a Require rule will let us in
# Make server ask for client certificate, but not insist on it
SSLVerifyClient optional
SSLVerifyDepth 2
SSLOptions +FakeBasicAuth +StrictRequire
# client certs will be verified against this CA
SSLCACertificateFile /etc/apache2/ssl/iapp-ca.pem
# Client with appropriate client certificate is OK
<RequireAll>
Require ssl-verify-client
Require expr %{SSL_CLIENT_I_DN_O} == "Company_O"
# User which is acceptable to basic authentication is OK
Require valid-user
</RequireAll>
# Set up basic (username/password) authentication
AuthType Basic
AuthName "Zugriffsschutz"
AuthBasicProvider file
AuthUserFile /etc/apache2/htaccess/iapp.passwd
# Access from these addresses is OK
Require ip 10.20.0.0/255.255.0.0
Require ip 10.144.100
</Directory>