Crear PKI Interna
Para crear la PKI interna se ha hecho uso del siguiente manual con ciertas modificaciones
- https://jamielinux.com/docs/openssl-certificate-authority/
- https://pki-tutorial.readthedocs.io/en/latest/simple/index.html
- https://www.ssltrust.com.au/help/setup-guides/internal-pki-openssl-nitrokey-hsm
Crear ROOT CA
Inicializar estructura
Cree la estructura de directorios y ficheros que son necesarios para el funcionamiento de la PKI.
mkdir /root/ca
cd /root/ca
mkdir certs crl newcerts private
chmod 700 private
touch root-ca-database.txt
echo 1000 > serial
A continuación cree el fichero de las politicas que va a usar la Root CA.
touch /root/ca/root-ca-openssl.cnf
nano /root/ca/root-ca-openssl.cnf
Copie el contenido
[ ca ]
# Indica que la policy a seguir esta en el apartado CA_default
default_ca = CA_default
[ CA_default ]
# Directory and file locations.
dir = /root/ca
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
# Modificamos el nombre del fichero de la base de datos que hemos creado antes
database = $dir/root-ca-database.txt
serial = $dir/serial
RANDFILE = $dir/private/.rand
# The root key and root certificate.
private_key = $dir/private/ca.key.pem
certificate = $dir/certs/ca.cert.pem
# For certificate revocation lists.
crlnumber = $dir/crlnumber
crl = $dir/crl/ca.crl.pem
crl_extensions = crl_ext
default_crl_days = 30
# SHA-1 is deprecated, so use SHA-2 instead.
# Aumentamos a SHA512 para mayor seguridad y dificultad de colisiones.
default_md = sha512
name_opt = ca_default
cert_opt = ca_default
# Cambiamos la duración del certificado, es la Root CA... vamos a darle 16 años
# es menos seguro, pero también menos trabajo para IT y si tenemos desconectada +
# y bien guardada la Root CA no debería ser problema.
default_days = 375
preserve = no
policy = policy_strict
[ policy_strict ]
# The root CA should only sign intermediate certificates that match.
# La idea es que la Root CA solo sirva para firmar SUBCA de la misma empresa
# sin embargo si queremos tener varias subCA, podemos poner el Organization Name y otros
# parametros como optional
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional