使用客户端 SSL 证书或基本身份验证进行身份验证

使用客户端 SSL 证书或基本身份验证进行身份验证

出于安全原因,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>

相关内容