Ahora asumo que has leído mi anterior post sobre cómo crear certificados autofirmados para el desarrollo y puede que te haya dejado pensando «¡Sí, genial! ….¿Pero cómo los uso realmente?». Esta entrada del blog le llevará paso a paso a través del proceso manual de configuración de IIS en su PC o servidor de Windows para utilizar sus certificados autofirmados junto con la autenticación de mapeo de certificado de cliente de IIS.
Por favor, tenga en cuenta que en mis ejemplos utilizo mi alojamiento localhost y un nombre de dominio al azar, pero se puede hacer esto en el IIS de su servidor real si usted tiene una dirección IP estática de su proveedor de servicios de Internet o su compañía de alojamiento de dominio, así como configurado su firewall, router, etc. correctamente donde finalmente se puede apuntar su nombre de dominio a su esa dirección. PERO no recomiendo ninguno de los dos junto con certificados autofirmados a menos que sus clientes/usuarios estén dispuestos a recibir e instalar su certificado raíz y de cliente autofirmado. Un buen ejemplo de esto es en una intranet cerrada donde usted tiene acceso a todas las computadoras de los usuarios finales porque entonces usted puede instalar los certificados en sus máquinas, lo cual es necesario si usted no quiere que sus usuarios reciban una gran advertencia sobre problemas de confianza con su certificado de servidor autofirmado. Si está buscando una solución comercial digna de producción, debería comprar sus certificados en lugar de autofirmarse. Así que ahora tenemos que fuera del camino que estoy usando un PC con Windows 8.1 Pro, IIS 8.5 y Visual Studio Premium 2013. (También he probado con una VM Hyper-V de Windows Server 2012 R2 en mi PC).
Instalación de IIS
Si aún no has instalado IIS en la máquina que actuará como servidor de alojamiento, hazlo pulsando el botón de Windows de un PC y busca «Activar o desactivar las características de Windows» (o ve al Panel de control y busca). Compruebe los Servicios de Información de Internet y los siguientes nodos secundarios.
(Si está ejecutando en .NET 3.5 necesita comprobar la Extensibilidad de .NET 3.5 y ASP.NET 3.5)
Para Windows Server 2012 vaya al panel de control del administrador del servidor ➜ Haga clic en añadir roles y características ➜ Elija la instalación basada en roles o en característicasbasado en la instalación y vaya a continuación ➜ Seleccione el servidor ➜ Habilite el rol de servidor llamado Servidor web (IIS) y los siguientes elementos hijos
Asegúrese también de que Desarrollo de aplicaciones esté marcado con los siguientes elementos hijos
Haga clic en Aceptar y deje que Windows instale.
Creando nuestro proyecto de ejemplo
Para esta demostración crearemos una miniaplicación realmente sencilla que alojaremos en el IIS local. (También puedes hacer un fork de la mía directamente en Github)
En Visual Studio, crea una nueva aplicación web vacía y haz referencia a la web api
Sólo necesitaremos un controlador reeeealmente sencillo:
using System.Web.Http;namespace IISWithCertificatesSample.WebApi.Controllers{ public class CatsController : ApiController { public IHttpActionResult Get() { return Ok("A lot of cats meowing for food"); } }}
Ahora deberías poder ejecutar ambas rutas (F5) y navegar a la url de localhost con /api/cats (la mía parece http://localhost:62172/api/cats). Impresionante, vamos a alojar esta aplicación usando nuestro IIS local.
NOTA: Ya no vamos a ejecutar la aplicación directamente desde Visual Studio (F5) que está configurado para usar IIS Express.
Configurando IIS
Abre tu Administrador de IIS (botón de Windows + buscarlo). Añade un nuevo sitio web y un pool de aplicaciones con nuestra aplicación de ejemplo. (Clic derecho Sitios ➜ Añadir sitio web) La ruta tiene que ser la carpeta donde se encuentran los documentos de tu sitio web, así que si has publicado tu sitio web apunta la ruta allí. Sólo voy a utilizar la ruta directa al proyecto en Visual Studio para este ejemplo muy simple.
Ahora vamos a alojar localmente este sitio especificando el nombre de host AKA. su nombre de dominio.
Dado que sólo estoy alojando localmente necesito añadir el sitio a mi archivo de hosts local con el fin de vincular mi dirección IP de localhost con el nombre de host. Esto se hace ejecutando el bloc de notas como administrador y abriendo el archivo hosts en la ruta: %systemroot%\System32\drivers\etc
Agregando lo siguiente al final: 127.0.0.1 sudominio.com www.yourdomain.com
Ahora cada vez que navegue a sudominio.com y www.yourdomain.com en mi máquina resolverá el sitio con mis enlaces recién añadidos a la dirección IP 127.0.0.1 (que es la IP de localhost).
Añadamos el enlace www. binding a tu sitio en el gestor de IIS también
Surfea el nombre de dominio que configuraste en los bindings con o sin www. y añade la terminación /api/cats y deberías obtener los gatos maullando. (Si no es así prueba a vaciar la caché)
IMPORTANTE: Esto sólo va a ocurrir en la máquina local porque hemos alterado el archivo hosts para redirigir nuestras peticiones del nombre de dominio que hemos añadido a la dirección IP del localhost. Está pensado para el desarrollo y para poder probar sus cambios antes de desplegarlos en su servidor de alojamiento web real.
Asegurar el servidor con SSL
Ahora queremos asegurar los gatos añadiendo un certificado SSL a nuestro Servidor.
En su Administrador de IIS vaya a su servidor (La parte superior del árbol a la izquierda) ➜ Desplácese hacia abajo y haga doble clic en Certificados de servidor.
(Si su certificado autofirmado ya está aquí, salte a los pasos de los enlaces)
Necesitamos importar nuestro certificado de servidor autofirmado para habilitar la comunicación https con SSL, así que haga clic en Importar…
Haga clic en el botón … y encuentre su archivo .pfx, rellene la contraseña (el parámetro -po en su archivo de lotes de comandos) y haga clic en Aceptar
Su certificado se añade ahora
Haga doble clic en el cert recién añadido para verificar que es de confianza. (Sus certificados autofirmados se añadieron a los almacenes correctos en mi post anterior, así que de nuevo: léelo si estás perdido ahora mismo ;-))
¡Hasta aquí, todo bien! Ahora podemos añadir el enlace https, de la misma forma que antes pero eligiendo https con puerto 443, tu dominio como nombre de host y buscando tu certificado autofirmado en la lista desplegable
Marca la casilla Server Name Indication que permite a nuestro servidor tener múltiples certificados instalados en la misma dirección IP enviando el nombre de host con la primera etapa del handshake SSL. Repita los mismos pasos para añadir SSL para www.sudominio.com pero con un certificado en el que el nombre CN coincida con el nombre del dominio o un certificado comodín
Nuestras vinculaciones están completas por ahora
Tadaa, ya puedes usar https://yourdomain.com/api/cats y https://www.yourdomain.com/api/cats
NOTA: Firefox no utiliza el almacén de certificados de Windows, por lo que tendrás que añadir tu CA raíz manualmente. Ve a Configuración de Firefox ➜ Opciones ➜ Avanzadas ➜ Ver Certificados ➜ Autoridades ➜ importar tu archivo CARoot.cer
Autenticación de Mapeo de Certificados de Cliente de IIS
Ya hemos pasado por los usos de los certificados raíz y de servidor y probablemente te estés preguntando qué hacer con el certificado de cliente que también creamos en mi anterior post. Esto es para situaciones en las que, por ejemplo, necesitamos autenticar a los clientes sin un enfoque de inicio de sesión de usuario y contraseña, sino que queremos que el servidor pida al cliente que muestre su certificado y, si es el correcto, el cliente puede entrar. Esto se puede hacer con un mapeo Many-To-One o One-To-One y le mostraré cómo hacer ambos manualmente en el Administrador de IIS.
Primero tenemos que instalar la característica, así que vuelve a sacar el «Turn Windows features on or off» e instala lo siguiente
Le diremos a nuestro servidor que requiera un certificado SSL del cliente
A continuación tenemos que configurar el servidor para que sepa qué certificado de cliente necesita validar, así que vamos al Editor de Configuración y elegimos la sección iisClientCertificateMappingAuthentication (también podemos introducir la ruta system.webServer/security/authentication/iisClientCertificateMappingAuthentication en el campo Section)
Many-To-One Mappings
Si quieres asignar varios certificados de cliente a un solo usuario este enfoque es el que necesitas. También se pueden compartir certificados de cliente de esta manera, instalando el certificado de cliente (y el CA Root, ya que estamos autofirmando el certificado) en otros usuarios en cualquier máquina para obtener acceso, siempre y cuando el certificado de cliente coincida con los criterios de la regla del mapeo. Por ejemplo, sería útil en una situación en la que se quisiera que todos los usuarios de una organización obtuvieran acceso a través de un único mapeo de usuario.
Habilitar la autenticación del mapeo de certificado de cliente
Para añadir un mapeo haga clic en el … de los manyToOneMappings
Aquí se añaden los usuarios a los que se quiere dar acceso.
Rellena las propiedades de un mapping y repite para cada usuario que quieras configurar para acceder o denegar. Recuerda que necesitas el certificado del cliente y el certificado de la CA raíz instalados en todos los mmc del usuario.
IMPORTANTE: Para que esto funcione necesitas introducir un nombre de usuario y una contraseña válidos y como mi ordenador es el servidor, las credenciales serán mi nombre de usuario y mi contraseña de Windows.
Ahora tenemos que crear algunas reglas que acompañen a este mapeo para que el servidor pueda determinar si un cliente tiene permiso para entrar o no. Es un así que haga clic en la propiedad de las reglas y el botón …
Voy a añadir una regla como un ejemplo donde el servidor comprobará el certificado del cliente para ver si está firmado por la raíz CA correcta. Siga adelante y agregue más reglas para más seguridad, por favor visite la referencia de mapeo IIS Many-To-One para más documentación.
Recuerda aplicar los cambios en el Administrador de IIS, así que cierra las ventanas de reglas y mapeos y haz clic en Aplicar
Abre una nueva ventana de navegador de incógnito para asegurarte de empezar de cero en cuanto a caché y cookies y entra en tu url con el /api/cats y verás que el navegador te pide un certificado. Elige el ClientCert y haz clic en ok para acceder a los gatos.
Si esto no funciona asegúrate de que tu certificado de cliente está en tu almacén de CurrentUser/Personal así como en el almacén de certificados de tu navegador. Si es así, vaya al Panel de control ➜ Opciones de Internet ➜ Contenido y haga clic en Borrar estado SSL.
Abre una nueva ventana de incógnito e inténtalo de nuevo, tu navegador debería pedirte ahora el certificado del cliente.
NOTA: Recuerda que, como he explicado antes, Firefox tiene su propio almacén de certificados, por lo que necesitas importar el certificado del cliente a «Tus Certificados» para poder utilizarlo.
Mapas de uno a uno
Vayamos a ver también los mapeos de uno a uno. Este enfoque significa que necesitamos un certificado de cliente individual para cada mapeo de usuario. Puede desactivar el mapeo uno a uno y utilizar el mismo certificado y usuario o crear nuevos. Vuelve al Editor de Configuración y abre de nuevo la sección iisClientCertificateMappingAuthentication. Haga clic en el … de los oneToOneMappings.
Para añadir el mapeo al certificado necesitamos exportar la clave pública del archivo de certificado del cliente. Esto lo podemos exportar desde la consola de administración de la máquina (pulsar el botón de Windows y buscar mmc) Hacer un snap-in en el almacén personal del certificado de la máquina local y exportar el certificado ssl del cliente que queremos utilizar sin la clave privada en el formato base64.
Haga clic con el botón derecho en el certificado recién exportado y ábralo con el bloc de notas. Elimina todos los saltos de línea del propio certificado.
Ahora copia eso en el campo de propiedades del certificado del mapeo y rellena el resto
IMPORTANTE: Para que esto funcione necesitas introducir un nombre de usuario y una contraseña válidos y como mi ordenador es el servidor, las credenciales serán un nombre de usuario y una contraseña de Windows.
De nuevo, recuerda aplicar los cambios.
Y ya está, pruébalo y cuando te lo pida elige el certificado que has mapeado para el usuario que acabas de mapear.
Espero que te haya servido este post y para mi próximo post repasaré cómo usar certificados autofirmados junto con Windows Azure y cómo configurar el IIS mediante código C#, échale un vistazo aquí: http://blog.jayway.com/2015/04/21/configure-a-windows-azure-cloud-service-to-use-your-self-signed-certificates-for-iis-client-certificate-mapping-authentication/
Que os vaya bien =)