使用客戶端 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

這個問題已經三個月了,所以OP可能不需要我的答案,但它可能會幫助任何想要此配置的人。

該問題被標記為 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>

相關內容