Autenticar con certificado SSL de cliente O autenticación básica

Autenticar con certificado SSL de cliente O autenticación básica

Por razones de seguridad, la autenticación de una aplicación web se debe migrar a certificados de cliente SSL. Debería ser posible iniciar sesión con nombre de usuario/contraseña o SSL. Además, a los usuarios de la intranet se les debe permitir utilizar la aplicación sin autenticación adicional.

Hemos intentado implementar este escenario según la documentación oficial, pero sin éxito.

Aquí está nuestra configuración actual.

<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>

Con esta configuración ni siquiera se solicita un certificado de cliente. Si eliminamos la configuración de autenticación básica, la autenticación del cliente SSL funciona bien.

Respuesta1

La pregunta tiene tres meses, por lo que es posible que el OP no necesite mi respuesta, pero puede ayudar a cualquiera que desee esta configuración.

La pregunta está etiquetada como apache-2.4 pero la configuración parece apropiada para 2.2. Esto no es del todo sorprendente ya que muchos ejemplos en la documentación de Apache 2.4 parecen no ser apropiados para 2.4.

Tenía dicha configuración funcionando en 2.2 (excepto "Permitir desde" que no funcionó) y tuve que reescribirla para 2.4. Descubrí que necesitaba algunos elementos que no eran evidentes de inmediato en la documentación.

No ofrezco ninguna garantía para esto; se basa en mi archivo de configuración sin pruebas. +StrictRequirePuede que no sea necesario SSLOptions; no lo he probado sin él, pero funciona de esta manera.

De hecho, SSLOptionses posible que la línea no sea necesaria en absoluto; +FakeBasicAuthprobablemente la opción no se esté utilizando. En la configuración que tengo aquí, en cuanto Company_Ose encuentre en el certificado se concederá el acceso. Según tengo entendido, +FakeBasicAuthse usa con Require valid-user(solo) y se otorga acceso si el DN del certificado se encuentra en la lista de usuarios definida en AuthUserFile, junto con una contraseña adecuada. Mi sistema no funciona de esa manera y sospecho que el OP tampoco quería hacerlo.

<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>

Yo tengo

<Directory />
    ...
    Require all denied
    ...
</Directory>

en un archivo de configuración diferente; podría ser que sea una parte importante de la receta.

Lo que me llevó un tiempo hacer que esto funcionara fue que parecía que la Require expr %{SSL_CLIENTbroca funcionaría por sí sola, pero finalmente me di cuenta de que eso Require ssl-verify-clienttambién era necesario (verhttp://httpd.apache.org/docs/2.4/mod/mod_ssl.html#authzproviders)

Respuesta2

La respuesta de @yitzchok-lavi me pareció muy útil, pero si (como yo) desea evitar la ventana emergente de autenticación básica que aparece para clientes fuera de su red y sin un certificado de cliente, la Require valid-userdirectiva debe estar dentro de la RequireAllsección. Además, la pregunta de OP sugiere que esto ya estaba presente en algún lugar de su configuración, pero para completar, si alguien se topa con esta pregunta, también SSLCACertificateFilees necesaria la directiva (para definir con qué certificados de cliente de CA se verificarán).

El fragmento de configuración que uso:

<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>

información relacionada