出于安全原因,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
这个问题已经是三个月前的问题了,所以原帖者可能不需要我的回答,但它可能会对任何想要这种配置的人有所帮助。
问题标记为 apache-2.4,但配置看起来适合 2.2。这并不完全令人惊讶,因为 Apache 2.4 文档中的许多示例似乎本身并不适合 2.4。
我在 2.2 中有一个这样的配置(除了“Allow from ”不起作用),并且必须为 2.4 重写它。我发现它需要一些在文档中没有立即显现出来的元素。
我对此不提供任何保证;它基于我的配置文件,没有经过测试。+StrictRequire
可能不需要SSLOptions
- 我还没有尝试过没有它,但它确实以这种方式工作。
就此而言,该SSLOptions
行可能根本不需要 -+FakeBasicAuth
可能没有使用该选项。在我这里的配置中,只要Company_O
在证书中找到,就会授予访问权限。据我了解,+FakeBasicAuth
与一起使用Require valid-user
(单独),如果在中定义的用户列表中找到证书中的 DNAuthUserFile
以及适当的密码,则授予访问权限。我的系统不是那样工作的,我怀疑 OP 也不想这样做。
<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
也是必需的(见http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#authzproviders)
答案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>