July 18, 2011

Importando certificados SSL .pfx en un BigIP de F5

F5 Networks
F5 Networks, Inc. (NASDAQ: FFIV) is a networking appliances company. It is headquartered in Seattle, Washington and has development and marketing offices worldwide. It originally manufactured and sold some of the very first load balancing products. F5 Networks' flagship product, the BIG-IP network appliance, was originally a network load balancer but today also offers other functionality such as access control and application security. Add-on modules to F5's BIG-IP family of products offer email filtering and intelligent compression to allow for lower bandwidth and faster downloads in addition to load balancing and local traffic management capabilities."
-- from Wikipedia [search: F5 Networks]

Administrar los certificados SSL desde un appliance como el BigIP de F5 es bastante sencillo, no pretendo hacer de esta nota un extenso documento sobre el manejo de certificados SSL o de la administración de un BigIP, sino como integrar este tipo de información.

Hace unos días en el equipo de trabajo nos hicieron llegar varios certificados para integrarlos en el appliance del proyecto al cual me encuentro asignado, sin embargo cuando revisé la información me di cuenta que estos venían en formato .pfx (pkcs12) y que para poder integrarlos en el BigIP era necesario extraer la información (certificados y llaves). Siendo usuario de HP-UX / Linux / OS-X (y que solo usa WindowsXP en una VM para el Outlook) me di a la tarea de extraer la información para poder integrarla en el BigIP.

Formato PEM
El formato PEM es el mas común que les emisores de certificados usan, se caracteriza por el contener las siguientes cadenas: "-----BEGIN CERTIFICATE-----" y "-----END CERTIFICATE-----", usualmente se les suele colocar la extensión .pem, .crt, .cer y .key. Al estar codificados en Base64 es posible manipularlos de una manera más sencilla.
Muchas aplicaciones suelen preferir este formato, ya sea incluyendo tanto los certificados como las llaves en un solo archivo o en archivos separados.

Format PFX | pkcs12
El formato PFX es un tipo de archivo binario que nos permite almacenar tanto los certificados como las llaves, así también el archivo se encontrará cifrado para resguardar su contenido. Este tipo de archivos es común usarlos en equipos con sistemas Windows para gestionar tanto los certificados como las llaves.

Para ello es necesario hacer uso del comando openssl, del cual encontrarán muy buenas referencias en internet, he aqui el procedimiento realicé; tomaremos de base el siguiente archivo: uat-domain-br.pfx:

1.
Extraer la llave privada, la cual se encontrará cifrada, sin embargo al estar en formato PEM será muy sencillo manipularlo; almacenarlo en un archivo uat-domain-br.pkey y listo!
andresaquino $> openssl pkcs12 -in uat-domain-br.pfx -nocerts
Enter Import Password:
MAC verified OK
Bag Attributes
    localKeyID: 41 D4 48 C4 1D 3E 50 FE CA 9E 8A 2F BF 10 A5 A7 4B BE 20 88 
    friendlyName: uat-domain-br
Key Attributes: 
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQILMvlgNl9pYYCAggA
MBQGCCqGSIb3DQMHBAifLKdAZolOJwSCAoDj0z0V6Ei+uVipCr+E7Hgiq9nfNEeX
7l9xq+KKCFt0nhMWrYQ+Pl/BtLUunIcjYYInR+OSms0hRZu4BkEf21p0XpwA+ozc
cdB+6Hlv6wekX6fCbm3eNTZxcrf+piA6bkfL9WVhCSjflZRMy7vnIvh4SSHH5u1z
...
aktJQmSYyj/d+8RiLUcUFtMQhWKiApbVpH/+suETkYsI21+RyKKB7SNea3iiOiCP
3BeIQBts5kcCkJfNCSQyqMvx7/n8IPk1fgSxRSC5GvUVFaFoHmozmfwN
-----END ENCRYPTED PRIVATE KEY-----
                  
2.
Extraer el certificado y almacenarlo en su correspondiente archivo, de igual manera vendrá en formato PEM
andresaquino $> openssl pkcs12 -in uat-domain-br.pfx -nokeys
Enter Import Password:
MAC verified OK
Bag Attributes
    localKeyID: 41 D4 48 C4 1D 3E 50 FE CA 9E 8A 2F BF 10 A5 A7 4B BE 20 88 
    friendlyName: uat-domain-br
subject=/C=BR/ST=Sao Paulo/L=Sao Paulo/O=Telecomunicacoes Ltda/OU=Telecomunicacoes Ltda/CN=uat.domain.br
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-----
MIIFMDCCBBigAwIBAgIQXjx+q1J1cjk+IYScAEYwrzANBgkqhkiG9w0BAQUFADCB
vDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug
YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDE2MDQGA1UEAxMt
VmVyaVNpZ24gQ2xhc3MgMyBJbnRlcm5hdGlvbmFsIFNlcnZlciBDQSAtIEczMB4X
...
42gBj6SyGVC6YYzfgE0Ng1LBVWzrFaShBKRLoKaTT/i46AfpHxQaoaX8kyDBdSoc
dI2vH3HeRSZ+yaPocx37nBcSW7tB0JcmgczcDUfCIG0/yht5GUBPBn9RzZcyMCOw
Tw/WAnaJs9x4z7nBHvmS1nGLjiOUc/vxaG3BjDXY+a0CK20ZiG3IZs52PFXRnwju
FX6FPeOcJ4lhgKcc6FQq3nppnnbfXUly0xE65JXPS5Vqp/EV
-----END CERTIFICATE-----
                  
3.
Extraer la llave, para mi es más sencillo hace esto ya que de cualquier manera la integrarlo al keystore (base de datos de llaves y certificados) del BigIP, descrifrará el archivo y lo integrará al keystore usando su propia contraseña. Sabiendo esto, extraemos la llave y así tendremos los archivos necesarios para darlos de alta en el appliance.
andresaquino $> openssl rsa -in uat-domain-br.key 
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQC9WE1i1bzmaRadzoDBKK9E0kY2KX0/as1dhYuvq6bAWUGmYyV1
v4EIGCE28oS2nvNN/F11imM0aYgixDN0Acdox1DA7mM7ksCNCBqjTG9hTNAIO5G1
XwHcxdQU3aZs7P2UZWUuQj/XrbkhBtJmXBnaUsXHfBMW7oRq6Fh1x84JowIDAQAB
AoGBAK0/J4egY/g6/Xuk4EBc9om1EJMsQTKOiZvhvp8dIzVqNdyFaVgkwm5ijbmW
...
vu5sliWRpO4ScJ3u+tOqeTFjWyRP+CY0jpOACt+iBI23/lfebhl8TkyVNk/Olgf+
/KrUURS3I3Ko1sTzjk62HQJAdwboaB55U5tu3bP+rX/Im9vWw3rIu/n/KArOooiZ
88kHDxBm/EQQplUOLl8glmkMt4rQSdh6g0Xzd+oykckQXw==
-----END RSA PRIVATE KEY-----

* ¿Notaron que la cadena de identificación pasó de: ENCRYPTED PRIVATE KEY a RSA PRIVATE KEY?

4.
Ahora bien, podremos verificar la información que hemos obtenido de la siguiente manera:
 - Proposito del certificado
andresaquino $> openssl x509 -in uat-domain-br.cert -noout -purpose 
Certificate purposes:
SSL client : Yes
SSL client CA : No
SSL server : Yes
SSL server CA : No
Netscape SSL server : Yes
Netscape SSL server CA : No
S/MIME signing : No
S/MIME signing CA : No
S/MIME encryption : No
S/MIME encryption CA : No
CRL signing : No
CRL signing CA : No
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : No
Time Stamp signing : No
Time Stamp signing CA : No
                  

- Fechas en las que el certificado se considera válido
andresaquino $> openssl x509 -in uat-domain-br.cert -noout -dates 
notBefore=Jul 15 00:00:00 2011 GMT
notAfter=Jul 14 23:59:59 2013 GMT
                  

- Corroborar que la llave corresponde al certificado.
andresaquino $> (openssl rsa -in uat-domain-br.key -noout -text -modulus;openssl x509 -in uat-domain-br.cert -noout -text -modulus ) | grep "Modulus="
Modulus=BD584D62D5BCE669169DCE80C128AF44D24636297D3F6ACD5D858BAFABA6C05941A6632575BF8108182136F284B69EF34DFC5D758A6334698822BD584D62D5BCE669169DCE80C128AF44D24636297D3F6ACD5D858BAFABA6C05941A6632575BF8108182136F284B69EF34DFC5D758A6352C5C77C1316EE846AE85875C7CE09A3
Modulus=BD584D62D5BCE669169DCE80C128AF44D24636297D3F6ACD5D858BAFABA6C05941A6632575BF8108182136F284B69EF34DFC5D758A6334698822BD584D62D5BCE669169DCE80C128AF44D24636297D3F6ACD5D858BAFABA6C05941A6632575BF8108182136F284B69EF34DFC5D758A6352C5C77C1316EE846AE85875C7CE09A3

Listo, ahora lo que sigue es integrar la información en el appliance.

Integrar la información en la consola BigIP del F5
1.
Importar la llave
Local Traffic -> SSL Certificates -> Import SSL Certificates

Import SSL Private Key

2.
Importar el certificado
Local Traffic -> SSL Certificates -> Import SSL Certificates
Import SSL Certificate

3.
Asignar un nuevo perfil SSL, de tipo client
Virtual Servers -> Profiles -> SSL -> Client
Add new SSL Profile

4.
Verificando que se integren tanto el certificado como la llave
Local Traffic -> SSL Certificates -> New Client SSL Profile...
Verificar que se cuenta con el certificado y la llave

5.
Y validar la información en la lista de perfiles SSL
Local Traffic -> SSL Certificates
Nótese que el appliance ha identificado y validado la información

6.
El siguiente paso es proporcionar la VirtualHost donde será asociado el certificado...
Local Traffic -> Virtual Servers
En la opción SSL Profile Client asignar el perfil creado anteriormente
7.
y validar su correcto funcionamiento...
Verificar información SSL

Mas adelante buscaremos tratar un poco más a fondo esta misma implementación con Apache en un esquema de tres o cuatro niveles, esperemos tener el tiempo para realizarlo.

Comentarios..?


Referencias


buen camino!