martes, 31 de agosto de 2010

Crear un sitio web con certificados

En esta entrada veremos como crear un sitio web y configurarlo para utilizar certificados. Esto nos permitirá hacer seguro el acceso al servidor, mediante seguridad basada en el transporte, es decir, utilizar un certificado de servidor para encriptar las comunicaciones (mediante SSL) y autenticar los clientes mediante certificados de cliente.


1. Dar permisos al certificado.


PermisosEl primer paso es dotar de permisos a las certificados para las cuentas que van a ejecutarlo. Dado que los certificado se va a utilizar desde IIS, va a ser necesario que la cuenta que ejecuta los procesos de IIS (“NETWORK SERVICE” en Windows Server y “ASPNET” en “Windows XP”), tenga permisos para leer los ficheros de clave privada de los certificados (en la entrada anterior explicamos como instalarlos).


Estos ficheros de clave privada se encuentran en la siguiente ruta:


C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\ MachineKeys


Podemos identificar los que nos interesan mediante la fecha y hora de creación (fecha y hora en la que los hayamos instalado). Para cada fichero, accedemos a sus propiedades del fichero y en la pestaña de seguridad se agrega el nombre de usuario: “NETWORK SERVICE” (de la maquina local) y los permisos: “Read” y “Read & execute”.


Este punto también se puede realizar mediante comandos. Mediante la herramienta FindPrivateKey del SDK de Windows obtenemos la ruta y el nombre del fichero con la clave privada.


FindPrivateKey.exe My LocalMachine –n "CN=NombreServidor"


Posteriormente, con la herramienta cacls.exe (ubicada en c:\windows\System32), se dan permisos al fichero:


cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\?" /E /G "NETWORK SERVICE":R


2. Crear el sitio web.


NewWebSiteLo primero es crear un sitio web, para ello hay que abrir los “Servicios de Internet Information Server” dentro de “Herramientas Administrativas” del “Panel de Control” o ejecutar directamente el programa inetmgr.exe. Desde el gestor del IIS, en la carpeta Web Sites del servidor local, seleccionar la opción de crear un nuevo sitio Web.


Aparece una pantalla que nos solicita el nombre del sitio web. Introducimos el nombre que queramos darle al sitio y pulsamos siguiente.


Puerto


En la nueva pantalla, se nos pide la IP (dejar valor por defecto), el puerto TCP (introducir un valor que este libre, el valor por defecto: 80 no suele servir). El último campo (cabecera de host) se puede dejar vacío. Pulsar el botón de siguiente, aparece otra pantalla en la que se nos solicita la ruta donde estarán almacenados los archivos del sitio web. Como de momento solo queremos probar el tema de seguridad, nos sirve cualquier carpeta vacía.


En esta pantalla, también aparece un check para habilitar el acceso anónimo al sitio web. En nuestro caso lo dejaremos habilitado. Posteriormente se puede modificar. El tener acceso anónimo o no al sitio web depende del escenario. En nuestro caso, utilizamos certificados de cliente (porque por ejemplo, los clientes están en otra red y no tienen cuentas en el servidor), por lo que el acceso anónimo es lógico.


Finalmente aparece una pantalla en la que se nos solicitan los permisos para el sitio. Por defecto aparece seleccionado solo permisos de lectura.


3. Configurar el sitio web.


PropiedadesIIS Una vez creado el sitio web, se ha añadido un nuevo elemento al árbol, es decir, un nuevo elemento en la carpeta Web Sites. Seleccionamos dicho elementos, pulsamos con el botón derecho y seleccionamos el elemento propiedades del menú contextual.


Aparece una ventana con varias pestañas. En la primera, podemos ver los valores que hemos dado a la descripción y al puerto TCP. Para utilizar SSL es necesario asignar un puerto SSL libre (en nuestro caso 456, el valor por defecto es 444).


Posteriormente, en la pestaña “Directory Security”, seleccionar “Server Certificate” y asignar un certificado existente. Posteriormente, pulsar el boton “Edit” y seleccionar “Require secure channel” (SSL) y “Require 128 bit encription”. En client certificates “Require client certificates”

miércoles, 9 de junio de 2010

Administración de certificados digitales en Windows

En la anterior entrada, vimos como crear certificados mediante comandos. Ahora tendremos que tratar con la gestión de dichos certificados en Windows, es decir, como instalarlos en el almacén de certificados del sistema, para que los servicios y los clientes puedan utilizarlos.

1. Almacén de certificados de Windows.

Windows utiliza como almacén de certificados del sistema el registro (dentro de HKEY_LOCAL_MACHINE o HKEY_LOCAL_USER en la ruta SOFTWARE\Microsoft\SystemCertificates\My\Certificates). Afortunadamente no es necesario tener que modificar manualmente el registro para instalar o quitar certificados, y estas tareas suelen realizarse a través de un complemento de la consola de administración (mmc). Los pasos a seguir para mostrar la consola con los certificados están en el siguiente enlace: Mostrar el visor de certificados.

Una alternativa al uso de esta consola es el uso de comandos (como hicimos para la generación de certificados).

Por ejemplo, la herramienta certmgr.exe que viene con el Windows SDK. Aunque esta herramienta no sirve por si sola, ya que, no permite la gestión de ficheros .pfx (los utilizados para distribuir la clave privada), para este tipo de ficheros utilizaremos otra herramienta: WinHttpCertCfg.

El almacén de certificados de Windows está organizado en categorías (personal, Entidades emisoras raíz de confianza, …) en función del propósito del certificado. Por tanto, a la hora de instalar los certificados, tendremos que tener en cuenta para que van a ser utilizados. Además, el almacén de certificados de Windows distingue entre certificados de la maquina local y los de la cuenta del usuario.

Cada certificado debe ser instalado de una forma, dependiendo del papel que vaya a realizar (si es una CA o no, si es certificado de cliente o servidor).

Una vez terminados todos los pasos, podemos utilizar la consola para comprobar que los certificados están instalados correctamente.

2. Instalar el certificado de CA como entidad raíz de confianza.

Este paso debe realizarse tanto en las maquinas cliente como en las maquinas de servidor. Para las maquinas de servidor hay que ejecutar el siguiente comando (se instala en la cuenta del equipo):

certmgr -add RootCA.cer -s -r localmachine root

Para las maquinas de cliente hay que ejecutar el siguiente comando (se instala en la cuenta del usuario):

certmgr -add RootCA.cer -s -r currentUser root

El argumento –add indica que se va a añadir el certificado indicado por el fichero que le sigue, el argumento –s indica que vamos a instalar el certificado en un almacén del sistema (esto es necesario para poder utilizar -r) y –r indica la localización en el registro de Windows (localmachine para HKEY_LOCAL_MACHINE y currentUser para HKEY_LOCAL_USER). Finalmente, el último argumento indica la ubicación donde se van a almacenar los certificados (dentro del almacén de certificados), en este caso, dado que es un certificado para ser utilizado como entidad raíz de confianza, ponemos root.


3. Instalar el certificado de cliente.

En las maquinas de cliente, se deberán instalar los certificados asociados a las cuentas de los usuarios que vayan a acceder al servicio mediante el script:

winhttpcertcfg -i CertificadoCliente.pfx -c CURRENT_USER\My -a NombreMaquina -p 1

-i indica el nombre del fichero de clave privada del certificado, –c la localización del registro donde se va a instalar (en este caso la cuenta del usuario), –a el nombre de la maquina y –p el password con el que se guardó el certificado (en nuestro ejemplo es: “1”).

Para instalar en las maquinas de servidor, es necesario cambiar la localización donde se va a instalar el certificado (en este caso la cuenta de la maquina), ya que el servidor desconoce cuales son las cuentas del usuario. Utilizaremos el siguiente script:

winhttpcertcfg -i CertificadoCliente.pfx -c LOCAL_MACHINE\My -a NombreMaquina -p 1

4. Instalar el certificado de servidor.

Este certificado solo es necesario instalarlo en la maquina de servidor, el script es muy similar al del caso anterior, solo cambia el nombre del fichero del certificado a instalar:

winhttpcertcfg -i NombreMaquina.pfx -c LOCAL_MACHINE\My -a NombreMaquina -p 1


5. Gestión con la consola.


Otra posibilidad es realizar estas operaciones manualmente mediante la consola. Para ello, hay que abrir la consola de gestión (mmc), para ello acceder al menú de Inicio, pulsar “Ejecutar” y escribir mmc. Se abre la consola, en el menú seleccionar “Archivo” e ir a “Agregar o quitar complemento”, se abre un cuadro de dialogo modal, pulsar el botón agregar para añadir el complemento de “Certificados”, se solicita el tipo de certificados que se quiere administrar (en este ejemplo: cuenta de usuario cuando se quiere utilizar CURRENT_USER o de equipo cuando se quiere utilizar LOCAL_MACHINE).


Para ver las entidades emisoras raíz de confianza, hay que acceder a la carpeta “Entidades emisoras raíz de confianza” (lo que corresponde al root del comando certmgr), mientras que para acceder a los certificados propios, hay que ir a la carpeta “Personal” (lo que corresponde a My del comando winhttpcertcfg).


6. Enlaces externos.


Mostrar el visor de certificados

Descripción de certmgr

Descarga de WinHttpCertCfg.

Descripción de WinHttpCertCfg

lunes, 7 de junio de 2010

Creación de certificados

En la primera entrada explique los conceptos básicos de certificados, que son y para que se utilizan. Esta entrada se va a encargar de explicar como crear dichos certificados mediante la herramienta makecert del SDK de Windows (también utilizaremos pvk2pfx.exe para convertir formatos de certificados). Esta herramienta tiene muchas opciones, pero aquí solo explicaremos las mas basicas para poder crear certificados de servidor (los que se utilizan para SSL en https) y de cliente (utilizados para identificar a los clientes). La ruta del SDK de Windows suele ser:

C:\Archivos de programa\Microsoft SDKs\Windows\v6.0A\bin

La descripción completa de makecert se puede encontrar en el siguiente enlace: descripción makecert.

Esta herramienta sirve para generar certificados. Sin embargo, para poder utilizar certificados en servicios, también es necesario instalarlos en las maquinas en las que se vayan a utilizar. Esto lo veremos en la siguiente entrada.

Como vimos en la entrada anterior, a la hora de emitir un certificado es necesario que una autoridad certificadora lo firme, para ello, nosotros vamos a funcionar como entidad certificadora, es decir, que seremos nosotros mismos los que demos validez a nuestros certificados.

De esta forma nos evitamos el tener que hacer una petición a una autoridad de certificación (con el consiguiente coste y la espera mientras nos gestionan el certificado), pero solo servirá para quienes quieran confiar en nosotros. Los escenarios adecuados son cuando se necesitan certificados para entornos de desarrollo o cuando los consumidores de los certificados nos conocen y por tanto confían en nosotros.

1. Generar un certificado para entidad certificadora.

Como acabamos de decir, el primer paso es crear un certificado para ser usado como entidad emisora raíz de confianza. El script necesario para crearlo es el siguiente:

makecert -n "CN=RootCA" -r -sv RootCA.pvk RootCA.cer

Al ejecutar el comando, aparecerán unas ventanas modales que solicitan una contraseña con la que se cifrará el fichero pvk y que se nos pedirá de nuevo cuando sea necesario leer el fichero. Por tanto será necesario apuntarla (para volver a introducirla cuando se nos pida) o utilizar siempre un mismo valor que sea fácil de recordar (por ejemplo: “1”). Esto es útil porque para cada certificado que queramos generar se nos pedirá una clave, aunque se puede comprometer la seguridad (por lo que puede no ser recomendable para certificados que no sean para entornos de Test).

El primer parametro (-n) identifica el nombre del certificado, en este caso RootCA, aunque podemos darle cualquier nombre que queramos, -r identifica que el certificado será firmado automáticamente (para poder actuar como entidad emisora raíz de confianza) y -sv identifica el nombre del fichero donde se va a almacenar la clave privada. Al final se indica el nombre del fichero de certificado que contiene solo la clave pública.

El resultado de este script son dos ficheros: RootCA.pvk y RootCA.cer. El fichero RootCA.pvk es necesario para poder generar los certificados (tanto de cliente como de servidor) y el fichero RootCA.cer es necesario para que poder conocer la cadena de confianza del certificado. Por lo tanto deberá estar instalado en las maquinas donde se vayan a utilizar los certificados.


2. Generar certificado de cliente.


El siguiente paso es generar e instalar el certificado de cliente. Nuevamente utilizaremos el comando makecert:

makecert -iv RootCA.pvk -n "CN=CertificadoCliente" -ic RootCA.cer -sky signature -pe -sv CertificadoCliente.pvk CertificadoCliente.cer

Nuevamente, aparecen las ventanas que piden un password. Procedemos como en el apartado anterior, por ejemplo, introducimos siempre el mismo, por ejemplo: “1”.

El primer argumento (-iv) indica la clave privada que se va a utilizar para firmar el certificado a generar (que es el fichero que hemos generado en el paso anterior), con el segundo (-n) se indica el nombre que vamos a dar al certificado que vamos a crear, con el tercero (-ic) el nombre del fichero de certificado que se utiliza como entidad certificadora, -pe marca el certificado como exportable, -sv indica el nombre del fichero de clave privada pvk que se va a generar y al final se indica el nombre del fichero .cer del certificado.

El resultado de este script es nuevamente dos ficheros: CertificadoCliente.pvk y CertificadoCliente.cer. Sin embargo, para instalar el certificado de cliente en las maquinas cliente y servidor, necesitamos el certificado en un formato distinto: .pfx (fichero de exportación de clave privada de certificados). Esto se consigue mediante la herramienta pvk2pfx, mediante el siguiente comando:

pvk2pfx -pvk CertificadoCliente.pvk -spc CertificadoCliente.cer -pfx CertificadoCliente.pfx -pi 1

El primer argumento (-pvk) indica el fichero de clave privada de origen, el segundo (-spc) argumento especifica el fichero que contiene el certificado, el tercero (-pfx) indica el nombre del fichero .pfx que se generará y el último (-pi) indica el valor de la clave para el fichero .pvk.

Nuevamente, en las ventanas que piden un password, introducimos siempre el mismo, por ejemplo: “1”.

El resultado es el fichero CertificadoCliente.pfx que debe ser instalado tanto en los clientes como en los servidores donde se vaya a instalar o acceder al servicio.

3. Generar certificado de servidor

El siguiente paso es crear e instalar el certificado de servidor (en las ventanas que aparecen pidiendo un password, introducimos siempre el mismo, por ejemplo: “1”):

makecert -iv RootCA.pvk -n "CN=NombreServidor" -ic RootCA.cer -pe -sv NombreServidor.pvk NombreServidor.cer

El comando es el mismo que para generar un certificado de cliente, salvo por el nombre del certificado y los nombres de los ficheros de certificado, lógicamente.

MUY IMPORTANTE: el nombre del certificado de servidor debe ser el nombre de la maquina donde se va a utilizar o su IP. Por ejemplo si se va a instalar en la maquina MAQUINA01, cuya IP sea 192.168.33.31 (según lo que se vaya a escribir en la url con la que accedamos al servicio, tal y como se ve en la imagen), deberemos escribir: "CN=MAQUINA01" o "CN=192.168.33.31". Esto es muy importante, porque al intentar acceder a la url se comprobará el nombre o IP de la maquina de la url con el del certificado y si no coincide se dará una advertencia de seguridad.

Para terminar, al igual que para el certificado de cliente, es necesario generar un fichero de exportación de clave privada de certificados (.pfx) para el certificado de servidor:

pvk2pfx -pvk NombreServidor.pvk -spc NombreServidor.cer -pfx NombreServidor.pfx -pi 1

Nuevamente el comando sigue siendo el mismo y solo varía el nombre del certificado.

4. Referencias

SDK de Windows
Descripción de Makecert.exe
Descripción de pvk2pfx

sábado, 22 de mayo de 2010

Certificados: introducción

Esta va a ser mi primera entrada en este blog y he decidido escoger un tema que me ha estado preocupando recientemente y que es el uso de seguridad basada en certificados en un servicio WCF. Por claridad (y espacio) he decidido que esta primera entrada se dedicará a aclarar los conceptos más importantes sobre certificados y en siguientes entradas, como crearlos, administrarlos y utilizarlos para securizar sitios web.

Para empezar hay que asumir que base de conocimientos tiene el lector. En este caso voy a asumir que cualquier persona que esté buscando información sobre el uso de certificados de seguridad en servicios WCF tendrá al menos una vaga idea de que es un certificado y para que se utiliza. Por ejemplo en las páginas web de bancos, tiendas o de páginas de correo aparece un candado amarillo que informa que la página está utilizando un protocolo de comunicaciones seguro (https), lo que garantiza que la información que envía dicha página (contraseña, número de tarjeta de crédito o cualquier otro dato) viaja encriptada por internet hasta el servidor. El candado amarillo también sirve para verificar la identidad del dueño de la página, para que el usuario pueda comprobar la identidad de a quién manda realmente los datos.

Este ejemplo muestra lo que es un certificado digital, un documento digital en el que un tercero garantiza la asociación entre una entidad (generalmente una organización o una persona) y una clave pública (de un algoritmo de criptografía asimétrica). La tercera parte anteriormente nombrada recibe el nombre de autoridad de certificación (CA). Por tanto un certificado consta de tres partes: el sujeto (la entidad real), la clave pública (la entidad digital) y la relación entre las dos partes anteriores validada por un tercero: la autoridad de certificación. Para dar validez e integridad al certificado, la CA firma el documento digital (genera un hash del contenido y lo encripta con una clave privada propia, la clave pública asociada es expuesta a todo el mundo para que cualquiera pueda comprobar la validez del certificado). Es decir, la CA dispone de un certificado con el que firma los certificados que emite.

Esto lleva a un nuevo problema ¿quién da validez al certificado de una CA? Generalmente otra CA (en cuyo caso solo hemos trasladado el problema) o un organismo público. Las Cas reconocidas por un organismo público emiten un certificado (llamado certificado de raíz) con el que firman su propio certificado que las identifica.

En resumen un certificado digital es un documento digital firmado con la clave pública de la CA (para asegurar la integridad de la información) y que contiene información descriptiva de una entidad y una clave pública. Los usos típicos de un certificado son:

- Identificación. Es el ejemplo trivial, un certificado emitido por una CA, permite confiar en la identidad de quién expone el certificado.
- Encriptación. Se utiliza la clave pública para encriptar la información. Nótese que la información solo se puede recuperar con la clave privada, que es custodiada por la entidad en cuestión.
- Integridad. Se puede utilizar la clave pública para firmar un hash de la información que se va a enviar y asegurar de esta forma que la información entre los dos extremos de comunicación no ha sido modificada.

De esta forma, un certificado digital es un medio de identificación en transacciones electrónicas que permite garantizar la autenticidad de la información recibida. Una analogía en el mundo no digital de un certificado es el DNI, que permite identificar a las personas pues se confía en el emisor del documento (el estado). No sorprenderá a nadie el hecho de que el DNI electrónico consista en un certificado digital emitido por la Fábrica Nacional de Moneda y Timbre.

Presentación

Bienvenidos a mi Blog, con él pretendo compartir mis modestos conocimientos de .NET con otros programadores que como yo cada día se enfrentan con problemas de esta plataforma.

También tengo intención también tratar otros temas que van mas allá de la plataforma .NET, pero que evidentemente están muy relacionados con el trabajo que realizamos (por ejemplo: bases de datos, certificados, HTML, ...).

Espero que lo encontréis de utilidad. Cualquier comentario que queráis hacer será bienvenido.