November 03, 2011

nibbles: Instalar certificados SSL en IIS 5 usando OpenSSL

Resulta que hace unos días nos solicitaron se hiciera la renovación de los certificados para el portal principal, sabiendo esto hicimos los correspondientes trámites, nos entregaron los documentos y pasamos la información al área correspondiente. Solo que cuando entramos en conversaciones nos dimos cuenta de un "pequeño" detalle técnico, la plataforma destino estaba basada en Windows y el servidor era un IIS (Internet Information Server) lo cual no se nos había aclarado, puesto que el requerimiento inicial fue para una plataforma basada en UNiX; para solucionar esta situación fue necesario realizar unos pasos adicionales.

Les voy a comentar brevemente como es el procedimiento para solicitar un certificado ante  una entidad certificadora, como en nuestro caso Verisign:
  • Generar el CSR
    • Un CSR (Certificate Sign Request) es una solicitud para generar un certificado digital validado por la entidad certificadora que nos interesa, una analogía sencilla sería cuando vamos a la Secretaría de Relaciones Exteriores y  mediante una carta solicitamos por escrito la expedición de un documento como lo es el pasaporte.
  • Indicar características del Certificado
    • En la solicitud es necesario indicar datos como el periodo por el cual se requiere el certificado, la plataforma operativa donde será instalado como puede ser un Apache sobre UNiX o un IIS sobre Windows, así como un responsable administrativo que sea identificable dentro de la organización, se hace el correspondiente pago y se inicia el proceso; si retomamos la analogía anterior, al SRE nos va a solicitar por cuanto tiempo requerimos sea válido nuestro pasaporte, donde vivimos, IFE, actas de nacimiento, pagamos y listo, se inicia el proceso.
  • Confirmación y emisión del Certificado
    • Una vez recibida la solicitud, la entidad certificadora realizará un contacto telefónico o por correo electrónico para confirmar que los datos son verídicos; es decir, se hace una _certificación_ de la información del cliente; si todo fue correcto, con la información del CSR se genera un nuevo certificado y se firma por la autoridad certificadora, sobra decir que si retomamos la analogía anterior; si todo fue correcto, nos sera expedido nuestro pasaporte con los sellos y firmas habidas y por haber de la oficina contralora.

Este es el panorama general que se suele seguir, a menos claro; que se tenga una consola de administrador en la entidad certificadora, se puedan generar los certificados y firmarlos, solo que una situación así implica tener mucho dinero para comprar todo un lote y administrarlo o tener privilegios como Security Administrator en el dominio raíz dentro de la autoridad certificadora (je!), pero ese será tema de otro post.

IIS/Windows y los wizards

Es muy sabido que la mayoría de las actividades administrativas en plataformas Windows se realiza usando los wizards y esta bien, el problema es que si no se conoce de fondo como se hacen las cosas, muy probablemente estaremos en un problema.
Y así fue, ya que en IIS para poder instalar un nuevo certificado o realizar una renovación, el CSR deberá ser generado desde el wizard; de otra manera no tenemos otra opción (visible) para realizarlo: primer problema.

PFX o PEM

PFX (Personal Information Exchange) es un formato que nos permite incluir muchos objetos (certificados) en un solo archivo, cifrandolo con una contraseña en un formato simétrico resultando en un archivo binario; por otro lado el formato PEM (Privacy Enhanced Mail) es un formato que incluye solo un objeto (certificado) pero ya sea cifrado o no, el archivo se encuentra en Base64 resultando ser su contenido en texto plano.
Para el caso que nos ocupa, el proveedor nos entregó los archivos en formato PEM y IIS los requería en formato PFX: segundo problema.

Bajo este panorama, fue necesario realizar lo siguiente:
  1. Convertir los archivos en formato PEM a formato PFX
  2. Usar la consola de administración de Windows para modificar el componente que gestiona los certificados

Conversión de un formato PEM a un formato PFX

En este punto es necesario aclarar que se cuenta con lo siguiente: una llave privada y el documento firmado por una entidad certificadora (lease "Esquema de Llave Pública"), así que usando OpenSSL creamos un contenedor PFX que incluyera los dos archivos ya mencionados.

[0000]: Listado de archivos a trabajar

Los archivos con los que vamos a trabajar (*.key la llave privada, *.csr el requerimiento y el *.pem es el certificado ya firmado)

[ 192.168.1.103 | macuarrita ] ~/empresita.com/ssl                   
andresaquino $ ls -l
total 24
-rw-------  1 andresaquino  admin  1232 Nov  1 01:49 www-empresita.csr
-rw-------  1 andresaquino  admin  1708 Nov  1 01:49 www-empresita.key
-rw-------  1 andresaquino  admin  2110 Nov  1 01:49 www-empresita.pem


[0001]: Verificación de la llave y el certificado

En este punto vamos a obtener el módulo (número que se obtiene de multiplicar los primos para generar el par público) que se usó para generar los documentos y que mediante OpenSSL podemos obtener de la llave privada, de la solicitud del certificado y del certificado como tal, esto con la finalidad de validar que hablamos del mismo emisor.
[ 192.168.1.103 | macuarrita ] ~/empresita.com/ssl                   
andresaquino $ openssl req \
-noout \
-modulus \
-in www-empresita.csr 
Modulus=E51184450DA5C27AE10600D04FB51AE1AD2B47E51D8B298EAA40C2E3EF6F89E068E2861BAB738C4B3D784E4EA4730FA628DC45723994AC5ED8FB05A0A0CDB2DE3AD99F803BFB7B9A328A74A1CA...53517E1A16DAF341BF52D89B51070F10108C3C20FCD8200525619018E19310B2299CF35D1034937C397D8E54FC6FEFB3D6D22410F7276D2AF6F
                  
[ 192.168.1.103 | macuarrita ] ~/empresita.com/ssl                   
andresaquino $ openssl rsa \
-noout \
-modulus \
-in www-empresita.key 
Modulus=E51184450DA5C27AE10600D04FB51AE1AD2B47E51D8B298EAA40C2E3EF6F89E068E2861BAB738C4B3D784E4EA4730FA628DC45723994AC5ED8FB05A0A0CDB2DE3AD99F803BFB7B9A328A74A1CA...53517E1A16DAF341BF52D89B51070F10108C3C20FCD8200525619018E19310B2299CF35D1034937C397D8E54FC6FEFB3D6D22410F7276D2AF6F
                  
[ 192.168.1.103 | macuarrita ] ~/empresita.com/ssl                   
andresaquino $ openssl x509 \
-noout \
-modulus \
-in www-empresita.pem 
Modulus=E51184450DA5C27AE10600D04FB51AE1AD2B47E51D8B298EAA40C2E3EF6F89E068E2861BAB738C4B3D784E4EA4730FA628DC45723994AC5ED8FB05A0A0CDB2DE3AD99F803BFB7B9A328A74A1CA...53517E1A16DAF341BF52D89B51070F10108C3C20FCD8200525619018E19310B2299CF35D1034937C397D8E54FC6FEFB3D6D22410F7276D2AF6F

[0010]: Generar un nuevo contenedor PFX

Ya que hemos validado, entonces procedemos a generar el contenedor PFX
[ 192.168.1.103 | macuarrita ] ~/empresita.com/ssl                   
andresaquino $ openssl pkcs12 \
-export \
-inkey www-empresita.key \
-in www-empresita.pem \
-name "Mi Empresita" \
-out www-empresita.pfx
Enter Export Password: [AQUI_UN_PASSWORD]
Verifying - Enter Export Password: [Y_LO_REPETIMOS]

[ 192.168.1.103 | macuarrita ] ~/empresita.com/ssl                   
andresaquino $ ls -l
total 32
-rw-------  1 andresaquino  admin  1232 Nov  1 01:49 www-empresita.csr
-rw-------  1 andresaquino  admin  1708 Nov  1 01:49 www-empresita.key
-rw-------  1 andresaquino  admin  2110 Nov  1 01:49 www-empresita.pem
-rw-rw----  1 andresaquino  admin  3198 Nov  1 02:55 www-empresita.pfx

[0011]: Verificar el contenedor PFX creado

En este paso, la contraseña que usamos para cifrar el contenedor nos volvera a ser requerida, pero solo con la finalidad de verificar que el contenido es el correcto.
[ 192.168.1.103 | macuarrita ] ~/empresita.com/ssl                   
andresaquino $ openssl pkcs12 \
-info \
-nokeys \
-in www-empresita.pfx
Enter Import Password: [AQUI_LA_CONTRASEÑA]

MAC Iteration 2048
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    localKeyID: 69 16 29 0D 19 20 13 C3 F0 FB CD EA A4 BC B0 FA AF 8D CB 9E 
    friendlyName: Mi Empresita
subject=/C=MX/ST=Edo. de Mexico/Tlalnepantla/L=CIUDAD DE MEXICO/O=Mi Empresita, S.A. de C.V./OU=IT Office/OU=Terms of use at www.verisign.com/rpa (c)05/CN=www.miempresita.com.mx
issuer=/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
-----BEGIN CERTIFICATE-----
MIIF6DCCBNCgAwIBAgIQZruZw+iic6r7S4gPJIM0XTANBgkqhkiG9w0BAQUFADCB
vDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug
YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDE2MDQGA1UEAxMt
VmVyaVNpZ24gQ2xhc3MgMyBJbnRlcm5hdGlvbmFsIFNlcnZlciBDQSAtIEczMB4X
DTExMDkwODAwMDAwMFoXDTE0MTAwNzIzNTk1OVowgesxCzAJBgNVBAYTAk1YMSQw
...
c/qHZLgBstj/5wuVvCUUStsnku+2EbNtD7eyPuF+qpqNGHmXqGuFc2vttA4O5ZKu
3GrW9z9Gb30Z0UCktw4WXAp4oJdPDNQ+xnyhj7/TsUZvR9B2f5xEINRU7drXmoAF
TSojYOYBRXkqshP9nB0oSvoQ7X0z60gHjKvLog==
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048

Listo, ya que contábamos con el contenedor PFX fue momento de movernos a la parte más aburrida del camino: Windows & IIS (je!)

Usando la Consola de Administración de Windows

Para poder instalar este certificado sin pasar por la penuria de los wizards, vamos a ingresar con la MMC (Microsoft Management Console) para levantar el componente o Snap-In (se lee cool verdad "Snap-In", yeah!) que administra los certificados en el sistema y registrar desde este punto, nuestro certificado.

Snap-In
Dice la documentación que un Snap-in es un componente independiente el cual se puede administrar mediante la consola de administración de Windows (sic), para ello levantamos la consola con el comando "mmc" y registramos el Snap-In que queremos usar, veamos!

[0100]: Ingresar a la consola (mmc)

Start Menu » Command Run » mmc

[0101]: Registrar un Snap-In

Add/Remove Snap-In

[0110]: Seleccionar el Snap-In de certificados

Add/Remove Snap-In » Add Standalone Snap-In

[0111]: Indicarle que son los que contiene el equipo localmente

Add/Remove Snap-In » Add Standalone Snap-In » Select Computer

[1000]: Seleccionamos el almacén personal e importamos un nuevo certificado

Console Root » Certificates » Personal » Certificates » All Tasks » Import ...


[1001]: Ingresamos la contraseña y registramos en el mismo almacén

Certificate Import Wizard » Password » Certificate Store


[1010]: Abrimos la consola de administración de IIS

Default Web Site » Properties


[1011]: Seleccionamos las propiedades del dominio en cuestión

Properties » Directory Security » Server Certificate..

[1100]: En nuestro caso, vamos a reemplazar o renovar un certificado

Replace the current certificate » Available Certificate » (select new certificate)



[1101]: Seleccionamos el certificado que importamos mediante el Snap-In y reiniciamos el dominio manejado

IIS Console » stop & IIS Console » start

[1111]: El último paso, verificar la información!

En las propiedades del navegador, podrán obtener la información del sitio


Se que posiblemente me hubiera ahorrado algunos pasos si hubiéramos generado el CSR desde la consola de IIS, pero no fue así el caso.. pero me alegra, pude poner en práctica más opciones del OpenSSL que por cierto resulta ser una navaja suiza en todo estos menesteres, practiquemos pues!

buen camino!