Certificados con OpenSSL


OpenSSL es una aplicación y una API GNU relaccionada con temas de cifrado cuya web es www.openssl.org. De esa web te puedes bajar el código fuente pero si no queres o no puedes compilarlo, hay binarios para Windows si buscas en los ports de Cygnus (Cygwin).

Los certificados son unos ficheros que sirven para “certificar” la identidad de un ordenador, empresa o persona y para realizar cifrado de datos. Los certificados contienen una clave pública y otra privada. La clave pública puede ser conocida por todo el mundo, pero la privada debe ser mantenida en secreto. Con la clave pública se cifran los datos y con la privada se descifran, de manera que cualquiera puede cifrar datos, pero sólo el propietario del certificado puede descifrarlos.

Creación del Certificado de la Autoridad de Certificación

Creación de la Clave Privada

Esto crea una clave privada de longitud 1024 bits con el algoritmo triple DES y la guarda en el fichero ca.key:

openssl genrsa -des3 -out ca.key 1024

Creación del Certificado Autofirmado

Hay que ejecutar la siguiente instrucción: (365 es el periodo de validez en dí­as)

openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Que va pidiendo los datos de la Autoridad de Certificación. La salida es un certificado en el fichero ca.crt con formato X509 (un formato de especificación de datos del certificado).

Emisión de una Solicitud de Firmado de Certificado (CSR)

Creación de la Clave Privada

openssl genrsa -des3 -out server.key 1024

Creación del CSR

El CSR o (Certificate Signing Request, petición de firma de certificado), es un fichero que crea una entidad para pedirle a otra que lo firme, verificando que los datos de la primera entidad son correctos. Así­ unas entidades van certificando a otras creando una cadena de certificación, donde la primera entidad de llama la raí­z de certificación.

openssl req -new -key server.key -out server.csr
Que va pidiendo los datos de la entidad solicitante del certificado y crea el fichero server.csr.

Firmado del CSR por la Autoridad de Certificación

Para que el CSR sea un certificado válido, dede haber una entidad que lo firme. Para ello hace falta el script sign.sh:


#!/bin/sh
##
##  sign.sh -- Sign a SSL Certificate Request (CSR)
##  Copyright (c) 1998-2000 Ralf S. Engelschall, All Rights Reserved.
##

#   argument line handling
CSR=$1
if [ $# -ne 1 ]; then
echo "Usage: sign.sign .csr"; exit 1
fi
if [ ! -f $CSR ]; then
echo "CSR not found: $CSR"; exit 1
fi
case $CSR in
*.csr ) CERT="`echo $CSR | sed -e 's/.csr/.crt/'`" ;;
* ) CERT="$CSR.crt" ;;
esac

#   make sure environment exists
if [ ! -d ca.db.certs ]; then
mkdir ca.db.certs
fi
if [ ! -f ca.db.serial ]; then
echo '01' >ca.db.serial
fi
if [ ! -f ca.db.index ]; then
cp /dev/null ca.db.index
fi

#   create an own SSLeay config
cat >ca.config <<EOT
[ ca ]
default_ca              = CA_own
[ CA_own ]
dir                     = .
certs                   = $dir
new_certs_dir           = $dir/ca.db.certs
database                = $dir/ca.db.index
serial                  = $dir/ca.db.serial
RANDFILE                = $dir/ca.db.rand
certificate             = $dir/ca.crt
private_key             = $dir/ca.key
default_days            = 365
default_crl_days        = 30
default_md              = md5
preserve                = no
policy                  = policy_anything
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
EOT

#  sign the certificate
echo "CA signing: $CSR -> $CERT:"
openssl ca -config ca.config -out $CERT -infiles $CSR
echo "CA verifying: $CERT < -> CA cert"
openssl verify -CAfile ca.crt $CERT

#  cleanup after SSLeay
rm -f ca.config
rm -f ca.db.serial.old
rm -f ca.db.index.old

#  die gracefully
exit 0

Y finalmente hacer:

sign.sh server.csr

Esto creará un certificado válido llamado server.crt y que podremos usar a su vez para firmar otros certificados.

Exportar el Certificado

Para exportar el certificado y la clave privada al formato de intercambio PKCS#12 (que se puede importar en los navegadores):

openssl pkcs12 -export -inkey server.key -in server.crt -out server.p12