
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. +StrictRequire
Puede que no sea necesario SSLOptions
; no lo he probado sin él, pero funciona de esta manera.
De hecho, SSLOptions
es posible que la línea no sea necesaria en absoluto; +FakeBasicAuth
probablemente la opción no se esté utilizando. En la configuración que tengo aquí, en cuanto Company_O
se encuentre en el certificado se concederá el acceso. Según tengo entendido, +FakeBasicAuth
se 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_CLIENT
broca funcionaría por sí sola, pero finalmente me di cuenta de que eso Require ssl-verify-client
tambié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-user
directiva debe estar dentro de la RequireAll
secció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 SSLCACertificateFile
es 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>