viernes, 21 de octubre de 2011

OpenSSL: Autogestionando nuestros propios certificados

Estimados; ahora vamos a ver como podemos gestionar certificados digitales con la finalidad de proveer de seguridad a nuestros futuros servicios que vayamos habilitando ya sea web, Base de datos, correo, Mensajería Instantánea, controlador de dominio, etc.
Debemos tener en claro conceptos como: entidad certificadora CA; petición de certificado; llave o key y certificado; conceptos que no voy a dar ya que hay definiciones muy buenas, claras y sencillas andando por san google. Ejm: http://es.wikipedia.org/wiki/Autoridad_de_certificación.
En el ámbito de seguridad existe una herramienta que usa algoritmos específicos para crear certificados digitales únicos para cada petición de certificado, esto quiere decir que es imposible que dos certificados generados puedan contener la misma clave con la que fue generada. Esta herramienta se llama OpenSSL que nació de la descontinuación de SSLeay porque sus creadores pasaron a chambear a diferentes empresas de seguridad pero dejaron el código fuente a la comunidad para que lo explote.

Para empezar necesitamos una CA y ya que no tenemos platita para comprar alguna comercial porque todo esto es una enseñanza, nosotros seremos nuestra propia CA. Debemos entonces generarnos nuestros propios certificados de nuestra propia CA no oficial. La desventaja de esto es que ningún navegador nos reconocerá como tal y nos pedirá confirmar cada vez ya que nuestro certificado no es reconocido o no se encuentra en su base de datos.

Instalaremos OpenSSL en nuestro debian (en mi caso es squeeze de 64bits):

root@pruebas:~# aptitude install openssl

Luego creamos una carpeta personalizada donde pondremos nuestros certificados y las llaves. En mi caso:
root@pruebas:~# mkdir EntidadCA

Luego dentro de ella creamos el archivo openssl.conf que es donde se guardarán las configuraciones personalizadas para nuestro caso:
root@pruebas:~# cd EntidadCA/ && touch openssl.conf

Y dentro de openssl.conf copiamos este contenido para que lo personalicen a su conveniencia:
###Esto es una personalización hecha por mì: JPC del archivo original ###ubicado en /etc/openssl/openssl.cnf

dir            = .     # variable que establece el directorio de trabajo
[ ca ]
default_ca     = CA_default
[ CA_default ]
serial         = $dir/serial             # archivo que guarda el siguiente número de serie
database       = $dir/index.txt          # archvio que guarda la bd de certificados
new_certs_dir =  $dir/certificados       # dir que guarda los certificados generados
certificate    = $dir/CACert.pem         # nombre del archivo del certificado raíz
private_key    = $dir/privado/CAkey.pem    # llave privada del certificado raíz
default_md     = md5                     # algoritmo de dispersión usado
preserve  = no  #Indica si se preserva o no el orden de los campos del DN cuando se pasa a los certs.
nameopt        = default_ca    # esta opcion y la siguiente permiten mostrar detalles del certificado
certopt        = default_ca
policy         = policy_match    # indica el nombre de la seccion donde se especifica que campos son obligatorios, opcionales y cuales deben ser iguales al certificado raíz
# seccion de politicas para la emision de certificados
[ policy_match ]
countryName                    = match           # match, obligatorio
stateOrProvinceName            = match
organizationName               = match
organizationalUnitName         = optional        # optional, campo opcional
commonName                     = supplied        # supplied, debe estar en la petición
emailAddress                   = optional
# seccion que indica   como los certificados deben ser creados
[ req ]
default_bits         = 1024            # tamaño de la llave, si no se indica 512
default_keyfile      = key.pem         # nombre de la llave privada
default_md           = md5             # algoritmo de dispersión a utilizar
string_mask          = nombstr         # caracteres permitidos en la mascara de la llave
distinguished_name =   req_distinguished_name # seccion para el nombre distinguido (DN)
req_extensions     = v3_req # seccion con mas extensiones que se añaden a la peticion del certificado
# seccion del nombre distinguido, el valor es el prompt que se vera en pantalla. datos del propietario del certificado. esta seccion define el contenido de datos de id que el certificado llevara.
[ req_distinguished_name ]
0.organizationName             = Nombre de la organizacion Ejemplo: Mi Empresa S.A.A
organizationalUnitName         = Departamento o division
emailAddress                   = Correo electronico
emailAddress_max               = 40
localityName                   = Ciudad o distrito Ejemplo: LIMA
stateOrProvinceName            = Estado o provincia Ejemplo: PERU
countryName                    = Codigo del pais (dos letras) Ejemplo: PE
countryName_min                = 2
countryName_max                = 2
commonName                     = Nombre comun (hostname o IP) Ejemplo: midominio.com
commonName_max                 = 64
# si en la linea de comandos se indica la opcion -x509, las siguientes extensiones tambien aplican
[ v3_ca ]
# indica que se trata de un certificado CA raíz con autoridad para firmar o revocar otros certificados
basicConstraints         = CA:TRUE
# especifica bajo que metodo identificar a la llave publica que sera certificada
subjectKeyIdentifier     = hash
# especifica como identifcar la llave publica
authorityKeyIdentifier = keyid:always,issuer:always
# extensiones de la opcion req
[ v3_req ]
basicConstraints               = CA:FALSE # los certificados firmados no son CA
subjectKeyIdentifier           = hash
# *************************************************************************************














Luego creamos una carpeta donde guardar los certificados creados y otra donde guardar las llaves creadas privadas.
root@pruebas:~# mkdir certificados privado && echo '01' > serial && touch index.txt
El primer archivo 'serial' simplemente contiene el siguiente número de serie de nuestros certificados, ya que apenas vamos a crear el primero su número de serie será 01, después de crearlo se actualizará a 02 y asi sucesivamente.'index.txt' será la base de datos propiamente en base al número de serie.
Quedàndonos así:

root@pruebas:~/EntidadCA# ls -l
total 16
drwxr-xr-x 2     root root   4096 nov 14 02:26 certificados
- rw-r--r--    1    root root       0    nov 14 02:26 index.txt
 -rw-r--r--    1    root root    3841 nov 14 01:58 openssl.conf
drwxr-xr-x 2     root root   4096 nov 14 02:26 privado
- rw-r--r--    1    root root      3    nov 14 02:26 serial


Creando Una CA (recuerden cambiar los datos por los suyos)

root@pruebas:~/EntidadCA# openssl req -new -x509 -extensions v3_ca -keyout privado/CAkey.pem -out CAcert.pem -days 365 -config ./openssl.conf
(Ojo!: al principio nos pedirà una pass phrase: que no es otra cosa que una frase cualquiera que nosotros elijamos; por ejm. 4rr1b4 P3rU)
Generating a 1024 bit RSA private key
...++++++
..........................++++++
writing new private key to 'privado/CAkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Nombre de la organizacion Ejemplo: Mi Empresa S.A.A []:MIPC S.A.C
Departamento o division []:Departamento TI
Correo electronico []:admin@mipc.com
Ciudad o distrito Ejemplo: LIMA []:LIMA
Estado o provincia Ejemplo: PERU []:PERU
Codigo del pais (dos letras) Ejemplo: PE []:PE
Nombre comun (hostname o IP) Ejemplo: midominio.com []:mipc.com

















y pasamos a explicar que significa cada paso:
a. req -new -x509   ---> crear un certificado nuevo autofirmado con el standar x509 (http://es.wikipedia.org/wiki/X.509)

b. -extensions v3_ca ---> crear un certificado raíz CA (como lo configuramos en el openssl.conf)

c.  -keyout  ---> nombre y donde guardará la llave privada (en este caso se guarda en privados

d. -out   ---> nombre del certificado raíz CA

e. -days 365 ---> el certificado será válido por 365 días (1 año)

f.  -config ---> archivo de configuración a utilizar (el que describimos openssl.conf

Lo anterior da por resultado dos archivos:
   Un certificado raíz CA (CAcert.pem)
   Una llave privada (privado/CAkey.pem) (La extensión "pem" es de Privacy Enhanced Message)

Solicitando un firmado de certificado

Si llegamos a este punto entonces ya nos hemos convertido en una entidad certificadora, claro sin más autoridad que para nuestro propio dominio, ahora crearemos una peticiòn de que nos firmen nuestro certificado para nuestro servicio.
root@pruebas:~/EntidadCA# openssl req -new -nodes -out solicitud.pem -config ./openssl.conf

Generating a 1024 bit RSA private key
..............................++++++
................................++++++
writing new private key to 'key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Nombre de la organizacion Ejemplo: Mi Empresa S.A.A []:MIPC S.A.C
Departamento o division []:Departamento TI
Correo electronico []:admin@mipc.com
Ciudad o distrito Ejemplo: LIMA []:LIMA
Estado o provincia Ejemplo: PERU []:PERU
Codigo del pais (dos letras) Ejemplo: PE []:PE
Nombre comun (hostname o IP) Ejemplo: midominio.com []:mipc.com

















Llegado a este punto abremos creado la peticion "solicitud.pem" de firma de nuestro certificado el cual usaremos con nuestro CA para crear el certificado que estamos pidiendo.

Firmando nuestra petición de Certificado.

Por último firmaremos la solicitud que hicimos en el paso previo, para firmarlo necesitaremos indicar la contraseña que autentifique que
somos la CA y que que por serlo tenemos la autoridad de autorizar (firmar) certificados. (Para nuestro propio uso).

root@pruebas:~/EntidadCA# openssl ca -out cert-firmado.pem -config ./openssl.conf -days 365 -infiles solicitud.pem
(ojo! nos pedirá la misma pass phrase que colocamos antes. ejm: 4rr1b4 P3rU
Using configuration from ./openssl.conf
Enter pass phrase for ./privado/CAkey.pem:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName      :PRINTABLE:'MIPC S.A.C'
organizationalUnitName:PRINTABLE:'Departamento TI'
emailAddress          :IA5STRING:'admin@mipc.com'
localityName          :PRINTABLE:'LIMA'
stateOrProvinceName   :PRINTABLE:'PERU'
countryName           :PRINTABLE:'PE'
commonName            :PRINTABLE:'mipc.com'
Certificate is to be certified until Nov 14 05:12:33 2012 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
















Como ven en el gràfico, se ha creado satisfactoriamente el certificado autofirmado para nuestro dominio.

root@pruebas:~/EntidadCA# cat cert-firmado.pem
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 1 (0x1)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: O=MIPC S.A.C, OU=Departamento TI/emailAddress=admin@mipc.com, L=LIMA, ST=PERU, C=PE, CN=mipc.com
        Validity
            Not Before: Nov 15 05:12:33 2011 GMT
            Not After : Nov 14 05:12:33 2012 GMT
        Subject: C=PE, ST=PERU, O=MIPC S.A.C, OU=Departamento TI, CN=mipc.com/emailAddress=admin@mipc.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:a5:00:94:13:3e:52:64:7b:17:76:0c:11:4b:5b:
                    b9:c8:55:96:34:9f:18:6c:31:69:23:29:e6:b4:15:
                    38:ca:69:de:78:6a:bc:d8:9c:d6:11:28:b0:1e:ae:
                    85:0c:40:59:36:ce:8c:ff:5c:af:00:e1:cd:d6:53:
                    ca:e3:d3:e8:a7:1b:05:bb:a5:db:7a:01:c7:b0:29:
                    2b:ba:29:a2:24:cb:6e:b1:8b:57:e0:0a:d1:b4:53:
                    47:50:60:8b:d9:3e:49:4c:cf:8a:64:fc:ea:d2:6e:
                    e4:3e:1b:55:53:8e:0c:9f:7f:14:d7:d7:61:30:83:
                    53:38:3e:92:e9:ee:e9:75:03
                Exponent: 65537 (0x10001)
    Signature Algorithm: md5WithRSAEncryption
        57:0b:ce:d3:57:73:6e:58:36:a8:ea:be:3a:5b:ad:1a:36:3c:
        23:28:09:e2:f7:cb:4a:f7:42:d0:f3:25:78:76:8e:78:a3:2d:
        87:3b:9e:e8:6e:8c:77:76:61:62:ca:ca:9e:bd:57:e0:ac:71:
        15:ab:37:b1:8b:bf:fa:35:66:f4:d5:76:38:52:48:34:51:14:
        94:e3:a2:c0:e9:f8:3d:68:d6:3a:5d:66:25:93:7c:ee:b2:7f:
        3a:0c:dd:a1:a8:91:50:9b:ee:e2:1e:28:83:65:a1:83:af:df:
        90:89:d1:ef:2e:c9:6c:6a:81:25:a4:3b:58:e4:b7:fe:66:fb:
        94:3c
-----BEGIN CERTIFICATE-----
MIICeTCCAeICAQEwDQYJKoZIhvcNAQEEBQAwgYwxEzARBgNVBAoTCk1JUEMgUy5B
LkMxGDAWBgNVBAsTD0RlcGFydGFtZW50byBUSTEdMBsGCSqGSIb3DQEJARYOYWRt
aW5AbWlwYy5jb20xDTALBgNVBAcTBExJTUExDTALBgNVBAgTBFBFUlUxCzAJBgNV
BAYTAlBFMREwDwYDVQQDEwhtaXBjLmNvbTAeFw0xMTExMTUwNTEyMzNaFw0xMjEx
MTQwNTEyMzNaMH0xCzAJBgNVBAYTAlBFMQ0wCwYDVQQIEwRQRVJVMRMwEQYDVQQK
EwpNSVBDIFMuQS5DMRgwFgYDVQQLEw9EZXBhcnRhbWVudG8gVEkxETAPBgNVBAMT
CG1pcGMuY29tMR0wGwYJKoZIhvcNAQkBFg5hZG1pbkBtaXBjLmNvbTCBnzANBgkq
hkiG9w0BAQEFAAOBjQAwgYkCgYEApQCUEz5SZHsXdgwRS1u5yFWWNJ8YbDFpIynm
tBU4ymneeGq82JzWESiwHq6FDEBZNs6M/1yvAOHN1lPK49PopxsFu6XbegHHsCkr
uimiJMtusYtX4ArRtFNHUGCL2T5JTM+KZPzq0m7kPhtVU44Mn38U19dhMINTOD6S
6e7pdQMCAwEAATANBgkqhkiG9w0BAQQFAAOBgQBXC87TV3NuWDao6r46W60aNjwj
KAni98tK90LQ8yV4do54oy2HO57obox3dmFiysqevVfgrHEVqzexi7/6NWb01XY4
Ukg0URSU46LA6fg9aNY6XWYlk3zusn86DN2hqJFQm+7iHiiDZaGDr9+QidHvLsls
aoElpDtY5Lf+ZvuUPA==
-----END CERTIFICATE-----
root@pruebas:~/EntidadCA#
















Entonces ahora ya disponemos de CACert.pem que lo podemos importar desde los navegadores de las pcs de los usuarios de nuestra red que administramos cosa que asì el navegador no estarà mostrando ese molestoso mensaje que nos indica que no es una conexiòn segura. Y disponemos de cert-firmado.pem que junto a CACert.pem lo podemos configurar en nuestros servidores que administremos y asì les abremos dotado de seguridad aunque sea de manera local.



No hay comentarios:

Publicar un comentario