Crear una Certification Authority
Tabla de Contenidos
El "home" de la CA
- Ponemos todo colgando de un subdirectorio... lo mejor es crear un usuario específico (e.g. "ca").
Creo un subdirectorio del home del usuario para poner la ca y pongo una variable de entorno para que use la configuración de ahí y no la default (en debian, la default está en /etc/ssl/openssl.cnf)
mkdir -pv ${HOME}/ca_dir
mkdir -pv ${HOME}/ca_dir/certs
mkdir -pv ${HOME}/ca_dir/private
mkdir -pv ${HOME}/ca_dir/reqs
mkdir -pv ${HOME}/ca_dir/signed_certs
chmod g-rwx,o-rwx ${HOME}/ca_dir/private
touch ${HOME}/ca_dir/index.txt
echo '01' > ${HOME}/ca_dir/serial
echo "export CA_DIR=${HOME}/ca_dir" >> ${HOME}/.bashrc
echo "export OPENSSL_CONF=${CA_DIR}/openssl.cnf" >> ${HOME}/.bashrc
openssl.conf de la CA
El archivo de configuración (el dichoso ${HOME}/ca_dir/openssl.cnf) debería tener un contenido semejante al siguiente:
[ ca ] default_ca = nuestra_ca [ nuestra_ca ] dir = /home/ca/ca_dir certificate = $dir/cacert.pem database = $dir/index.txt new_certs_dir = $dir/certs private_key = $dir/private/cakey.pem serial = $dir/serial default_crl_days = 7 default_days = 120 default_md = md5 policy = nuestra_ca_policy x509_extensions = certificate_extensions [ nuestra_ca_policy ] commonName = supplied stateOrProvinceName = supplied countryName = supplied emailAddress = supplied organizationName = supplied organizationalUnitName = optional [ certificate_extensions ] basicConstraints = CA:false # data for creating self-signed certificate [ req ] default_bits = 2048 default_keyfile = /home/ca/ca_dir/private/cakey.pem default_md = md5 prompt = no distinguished_name = nuestra_ca_distinguished_name string_mask = utf8only x509_extensions = nuestra_ca_extensions [ nuestra_ca_distinguished_name ] commonName = Nuestra Certification Authority stateOrProvinceName = Ciudad Autónoma de Buenos Aires countryName = AR emailAddress = cert_auth@example.org organizationName = Nuestra Certification Authority [ nuestra_ca_extensions ] basicConstraints = CA:true
Crear el certificado de la CA
Con el openssl.conf armado, y asegurándonos de tener inicializadas las variable de entorno ${CA_DIR} y ${OPENSSL_CONF} , creamos un certificado raíz autofirmado (con validez por dos años = 730 días):
openssl req -x509 -utf8 -newkey rsa:2048 -days 730 -out ${CA_DIR}/cacert.pem -outform PEMNos va a pedir una passphrase para la clave privada. Esta passphrase debe ser MUY buena (en realidad, hasta deberíamos guardar toda la CA off-line).
Esto creó un certificado en ${CA_DIR}/cacert.pem y la clave privada en ${CA_DIR}/private/cakey.pem.
- Ahora hagamos una copia del certificado pero en formato DER para las versiones viejas del MSIE:
# no estoy muy seguro de esto :-(
openssl x509 -in ${CA_DIR}/cacert.pem -outform DER -out ${CA_DIR}/cacert.derY hagamos una copia de la clave privada en formato DER...
OJO
Por algún motivo esto no encripta la clave privada, con lo cual no recomiendo pasar la clave privada a formato DER... espero que alguien conteste mi consulta en la lista
Lamentablemente, no hay forma de pedirle razonablemente al comando que nos pida la passphrase para encriptar la nueva clave privada, entonces:
creamos un archivo ${CA_DIR}/private/cakey.pass con una única línea que va a ser la clave para encriptar ${CA_DIR}/private/cakey.der (no tiene porqué ser la misma que la que usamos para encriptar ${CA_DIR}/private/cakey.pem).
- una vez creado ese archivo en ese lugar, hacemos:
openssl rsa -in ${CA_DIR}/private/cakey.pem -passout file:${CA_DIR}/private/cakey.pass -outform DER -out ${CA_DIR}/private/cakey.der
ver el certificado de la CA
- Para ver cómo quedó el certificado:
openssl x509 -in ${CA_DIR}/cacert.pem -text -noout -nameopt oneline,-esc_msb- Para ver cómo quedó la clave privada (obviamente, va a pedir la passphrase):
openssl rsa -in ${CA_DIR}/private/cakey.pem -text -nooutListo.