Você está na página 1de 7

Autentificacin con DNIe en IIS7

Esta gua permite configurar un servidor IIS7 para que solicite certificados de autenticacin del DNIe (DNI
electrnico). Buena parte de lo que aqu cuento forma parte de un piloto desarrollado por Paco del Campo.
Algunas cosas que rodean al DNIe parecen seguir el principio de security through obscurity. Lstima que el
portal del DNI Electrnico no tenga informacin sobre los dos perfiles fundamentales en la difusin de los
servicios con autenticacin digital, los programadores y los tcnicos de sistemas.

Posibles usos de los certificados


Un sitio web puede utilizar certificados del DNIe para identificar de forma completamente segura a un usuario
de un servicio electrnico.
Si los usuarios que acceden son totalmente desconocidos para nuestra organizacin (no tenemos cuenta de
usuario o forma de identificacin equivalente), el certificado nos permite conocer la identidad del solicitante,
su nombre y su NIF. Con estos datos, podemos asociarlos a un posible registro existente en nuestra base de
datos o crear un nuevo registro.
Si por contra, el usuario del DNIe tiene una cuenta de usuario en nuestro directorio, podemos decidir asociar
la clave pblica de este certificado con esa cuenta de usuario. De esta forma, tendremos un mtodo de
autenticacin de alta seguridad, que podra reemplazar al tradicional usuario/contrasea.

Pasos a seguir
El proceso consta de las siguientes fases:

Registrar en el servidor los certificados de la CA raz y de la CA subordinada del DNIe

Instruir a IIS7 para que solicite certificados de cliente,

Definir el tipo de equivalencia entre certificados y cuentas de usuario

Decidir qu poltica se va a seguir con la validacin de certificados revocados

Antes de empezar, es fundamental asegurarse de que el cliente en el que est el lector de DNIe funciona
correctamente, validndolo con alguno de los servicios de dnielectronico.es.

Registro de CAs
El servidor IIS debe tener registradas las CA raz y subordinadas que permitan validar los certificados que
queremos emplear, en nuestro, la CA Raz y la CA subordinada 001.
Se descargan en el servidor y se da doble clic para instalarlas. Dentro del asistente para importarlas, es
importante elegir la opcin de seleccin manual del almacn de certificados, y la opcin 'mostrar almacenes
fsicos'. De esta forma, siendo administradores de la mquina, podemos registrar los certificados en el
almacn de sistema, de forma que otros servicios puedan verlos. Si no somos administradores, o UAC est
activo, los certificados se registrarn para este usuario.
En de la CA raz se meter en el de "Entidades de certificacin raz de confianza" y el de la subordinada en
"Entidades de certificacin intermedias".

Configuracin de IIS7
Tenemos que activar SSL en el servidor web deseado, para lo que se seguirn los pasos de generar o
solicitar un certificado y activar el binding del servidor al puerto 443. Es importante comprobar en este punto
que somos capaces de establecer una conexin segura al servidor.
El siguiente paso es indicar a IIS7 que queremos utilizar certificados de cliente en el proceso de
establecimiento de la conexin SSL. Esto se realiza desde la configuracin de SSL de IIS.

Tambin debemos revisar la configuracin de autenticacin, para asegurarnos, con independencia del
tratamiento de los certificados, que nuestro sitio tiene permisos correctos de acceso, que se controlarn
limitando los permisos de las carpetas IIS correspondientes.

Ahora tenemos que decidir cmo hacer la equivalencia entre certificados y cuentas de usuario de la mquina.
Hay dos posibilidades:

Uno a uno (oneToOneMappings): el usuario del certificado tiene ya una cuenta en nuestro dominio,
por lo hacemos que cada certificado equivalga a una cuenta del dominio o de la mquina. La
asociacin se hace con la clave pblica del certificado.

Muchos a uno (manyToOneMappings): hacemos que todos los certificados que cumplan un
determinado criterio se asocien a una cuenta del dominio o de la mquina, que es la que finalmente
acceder a los contenidos. Este escenario es el ms habitual cuando no conocemos a priori los
certificados que vamos a manejar, en el que cualquier certificado vlido puede ser usado para
acceder a nuestro servicio.

La configuracin de estas opciones no se puede realizar directamente desde la administracin de IIS, sino
editando los ficheros XML del directorio \Windows\System32\inetsrv\config, en concreto el fichero
applicationHost.config.
Sin embargo, hay una herramienta tremendamente til que nos ayudar, el Administration Pack para IIS
(versin beta, para entornos x32, hay otra descarga para x64), que ofrece "Configuration Editor", una
herramienta que se integra con la consola de administracin y que permite editar cualquier parmetros de los
ficheros .config generales o especficos de una web, explorar las posibles configuraciones (analiza el
esquema de los ficheros), buscar... Una vez instalado, aparece en la parte de abajo de las herramientas de
administracin.

Vamos a realizar una configuracin manyToOne, por lo que abriremos en Configuration Editor en el servidor
deseado, y exploramos la clave
system.webServer/security/authentication/iisClientCertificateMappingAuthentication.
En esta pgina se explica cmo hacer el mapeo oneToOne, similar a lo aqu expuesto, salvo por la necesidad
de incorporar la clave pblica del certificado que se desea asociar.

Activamos la opcin manyToOneCertificateMappingsEnabled y entramos en la opcin ManyToOneMappings,


en la que definiremos cada una de las asociaciones.

Creamos una asociacin, dndole un nombre descriptivo, e introduciendo los datos de una cuenta de usuario
que ser la que acceda a los contenidos para los usuarios que se validen con el certificado correspondiente.
Es conveniente crear una cuenta sin ningn tipo de privilegio, y aadirla a la seguridad de acceso de la
carpeta IIS que tenga los contenidos.

Ahora tenemos que crear una o varias reglas, que sern los patrones de certificados que aceptamos para
esta asociacin. Podemos hacer reglas muy generales (todos los certificados de una autoridad) u otras ms
especficas. Para ello, elegimos qu campo/subcampo del certificado queremos usar y cul debe ser su valor.
Se pueden usar wildcards como *.

En nuestro caso, el certificateField es el Issuer, y dentro del mismo, elegimos el certificateSubField OU, que
en el caso del DNIe es DNIE.

Aceptamos todos los cambios realizados.

Validacin de certificados revocados


Por defecto IIS tratar de validar el estado de revocacin de los certificados empleados, pero por defecto, no
existe un servicio OCSP en el que validarlos.
El Ministerio de Industria tiene un servicio OCSP operativo en http://ocsp.ctpa.mityc.es. Para poder usarlo,
debemos modificar las propiedades de la CA intermedia AC DNIE 001. Para modificarlo, abrimos una mmc de
certificados sobre la cuenta de mquina y editamos las propiedades (con botn derecho sobre la CA) de AC
DNIE 001, aadiendo un servicio OCSP adicional a la direccin anterior.

La otra posibilidad es desactivar la validacin de las listas de revocacin, en caso de que no tengamos
acceso a la red o queramos que sea as. Tenemos que usar la herramienta netsh para modificar sus
propiedades.
Arrancamos netsh y usamos el comando http para entrar en este contexto. Con el comando show sslcert
veremos la relacin completa de endpoints http definidos, alguno de los cuales tiene ssl activo. Podemos ver
uno concreto con la opcin ipport.

Es importante copiar toda la configuracin que se muestre del que queremos cambiar, porque tendremos que
borrarlo y crearlo de nuevo (se puede hacer show, delete y add, pero no set ?).
Vemos la configuracin completa:

Lo borramos con:
delete sslcert ipport=192.168.0.103:443
Y lo creamos de nuevo, cambiando la opcin verifyclientcertrevocation.
add sslcert ipport=192.168.0.103:443 certhash=16d044b6c802473cc3c59c204e8f92928b3dd011
appid={4dc3e181-e14b-4a21-b022-59fc669b0914} certstorename=MY
verifyclientcertrevocation=disable

Y comprobamos todo...
Creamos una pgina default.aspx en el servidor, con un cdigo que nos permita recoger y mostrar los datos
del certificado, para as asegurarnos que todo funciona.
<%@ Page Language="C#"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>

<body>
<h2>Informacin en el certificado</h2>
<p>
<%
HttpClientCertificate cs = Request.ClientCertificate;

Response.Write("ClientCertificate Settings:<br>");
Response.Write("Certificate = " + cs.Certificate + "<br>");
Response.Write("Cookie = " + cs.Cookie + "<br>");
Response.Write("Flags = " + cs.Flags + "<br>");
Response.Write("IsPresent = " + cs.IsPresent + "<br>");
Response.Write("Issuer = " + cs.Issuer + "<br>");
Response.Write("IsValid = " + cs.IsValid + "<br>");
Response.Write("KeySize = " + cs.KeySize + "<br>");
Response.Write("SecretKeySize = " + cs.SecretKeySize + "<br>");
Response.Write("SerialNumber = " + cs.SerialNumber + "<br>");
Response.Write("ServerIssuer = " + cs.ServerIssuer + "<br>");
Response.Write("ServerSubject = " + cs.ServerSubject + "<br>");

Response.Write("Subject = " + cs.Subject + "<br>");


Response.Write("ValidFrom = " + cs.ValidFrom + "<br>");
Response.Write("ValidUntil = " + cs.ValidUntil + "<br>");
Response.Write("What's this = " + cs.ToString() + "<br>");

%>
</p>
</body>
</html>

Si algo falla, recibiremos mensajes de error en el cliente. Lo mejor es comprobar en los ficheros de log del
servidor (\inetpub\logs\) para ver el cdigo y subcdigo de error (ej. 403.16) y as analizar qu es lo que est
fallando.

Y si todo va bien:

Você também pode gostar