Skip to main content

Subortdinate/Signing Certification Authority

Despliegue la máquina que estará siempre encendida o bien disponible en el entorno como entidad de certificación subordinada. Esta máquina será la que se use para firmar los certificados finales (equipo, servidor web, email).

mkdir -p /root/ca/intermediate 
cd /root/ca/intermediate
mkdir certs crl csr newcerts private
chmod 700 private
touch subordinate-ca-database.txt
echo 1000 > serial
echo 1000 > /root/ca/intermediate/crlnumber

Crear clave privada de la Intermediate CA

Ahora va a crear la clave privada de la Entidad Subordinada de Certificación. Tal y como pasa con la clave de privada de la Root CA (y como con cualquier clave privada) es importante que nadie tenga acceso a ella, puesto que con dicha clave se podrán firmar certificados para el entorno.

openssl genrsa -aes256 \
      -out /root/ca/intermediate/private/intermediate.key.pem 4096

Se le solicitará insertar una contraseña para salvaguardar la clave privada. Introduzca una diferente a la que uso para la clave privada de la Root. A continuación, modifique los permisos para que solo los usuarios con permisos de root (los administradores de la PKI) puedan leer dicho fichero

chmod 400 /root/ca/intermediate/private/intermediate.key.pem

Crear certificado público de la Intermediate CA

Genere el documento CSR de la Intermediate

cd /root/ca
openssl req -config root-ca-openssl.cnf \
      -new -sha512
      -key /root/ca/intermediate/private/intermediate.key.pem
      -out /root/ca/intermediate/csr/intermediate.csr.pem

Introduzca la contraseña que ha generado en el paso anterior (la privada de la Intermediate). A continuación introduzca los datos que se le piden.

A continuación, copie el fichero CSR generado al equipo de configuracióla Root CA a la ruta

/root/ca/intermediate/csr/

En el servidor de la Root CA proceda con la firma y generación del certificado de la Intermediate CA y ejecute el siguiente (escomando

el
cd mismo/root/ca
queopenssl laca -config root-ca-openssl.confcnf pero\
      con-extensions algunosv3_intermediate_ca cambios\
      realizados)-days 3650 -notext -md sha512 \
      -in /root/ca/intermediate/csr/intermediate.csr.pem \
      -out /root/ca/intermediate/certs/intermediate.cert.pem

Se le solicitará la contraseña de la clave privada de la Root CA.

Modifique los permisos del fichero para que pueda ser legible por los usuarios.

chmod 444 root/intermediate.cert.pem

Una vez firmado, en el apartadocontenido del fichero ca_defaultroot-ca-database.txt podrá ver que se ha generado un nuevo registro. No elimine bajo ningún concepto el registro o el fichero.

Verifique los datos del certificado

openssl x509 -noout -text -in /root/ca/intermediate/certs/intermediate.cert.pem

Como Issuer deberá aparecer la Root CA y las fechas de validación deberán ser las correctas.

También ha de aparecer el campo CA: TRUE (ya que está siendo firmada para una Intermediate CA, la cual FIRMARÁ los certificados de los nodos finales)

Verifique la cadena de certificación

cd /root/ca
openssl verify -CAfile /root/ca/certs/root-ca.cert.pem /root/ca/intermediate/certs/intermediate.cert.pem

Descargue los ficheros root-ca.cert.pem, /root/intermediate.cert.pem y copielos en el servidor de la Intermediate CA.

Instale el certificado de la Root CA en el servidor SUB CA

cp root-ca.cert.pem /etc/ssl/certs/ -v
ln -s /etc/ssl/certs/root-ca.cert.pem /usr/local/share/ca-certificates/root-ca.cert.pem
update-ca-certificates --fresh

Finalmente elimine el fichero CSR de la intermedia en el servidor Root CA y en el crl_info.Servidor SubCA.

Generar CambiosCertificado enFullChain

Si desea también puede generar un certificado con ambos (fullchain) ya que algunas aplicaciones necesitan tener toda la cadena de certificación para dar como válido el ficherocertificado.

[ CA_default ]
dir             =cat /root/ca/intermediate
database        = $dir/subordinate-ca-database.txt
private_key     = $dir/private/intermediate.key.pem
certificate     = $dir/intermediate/certs/intermediate.cert.pem crl             = $dir/crl/intermediate.crl./root/ca/certs/root-ca.cert.pem policy> =full-chain.pem
policy_loose
copy_extensions

Este =certificado copyfullchain #servirá Permitepara indicar que si el campo no viene definido encomprobar la politica # que nosotros definimos para ese tipocadena de certificado, haga uso del que viene en el CSR. # Cuidado! Se debe tener bien definidovalidación en los webserver,certificados emailfinales.

el

Generando campoconfiguración CA:FalseSUB-CA

#

Ahora Siya noes lomomento tenemosde definidodefinir yla enconfiguración elque CSRusará vienela CA:True,Intermediate estaremosCA firmandopara una SUBCA... # Existen 3 valores: # none -> Solo añadefirmar los quecertificados tengamosfinales.

en la politica, elimina los del CSR que no cuadren # copy -> Usa los del CSR, pero si la politica lo define, usa el de la politica # copy_all -> Ignora los de la politica y usa los del CSR --> NUNCA USAR!!!!! [ crl_info ] URI.0 = http://pki.driverlandia.com/sub-ca.crl URI.1 = https://www.driverlandia.com/pki/sub-ca.crl
touch 

Copie el contenido dely ficheroguardelo

Fichero sub-ca-openssl.cnf
[ 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/intermediate
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/subordinate-ca-database.txt
serial            = $dir/serial
RANDFILE          = $dir/private/.rand

# The root key and root certificate.
private_key       = $dir/private/intermediate.key.pem
certificate       = $dir/certs/intermediate.cert.pem

# For certificate revocation lists.
crlnumber         = $dir/crlnumber
crl               = $dir/crl/intermediate.crl.pem
crl_extensions    = crl_ext
default_crl_days  = 365

# 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      = 5840
preserve          = no
policy            = policy_loosepolicy_intermediate

# Permitimos copiar las extensiones tipo SAN  
copy_extensions   = copy


[ 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

[ policy_loosepolicy_intermediate ]
# Allow the intermediate CA to sign a more diverse range of certificates.
# See the POLICY FORMAT section of the `ca` man page.

countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req ]
# Options for the `req` tool (`man req`).
default_bits        = 4096
distinguished_name  = req_distinguished_name
string_mask         = utf8only

# SHA-1 is deprecated, so use SHA-2 instead.
default_md          = sha512

# Extension to add when the -x509 option is used.
x509_extensions     = v3_cav3_intermediate_ca

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
stateOrProvinceName             = State or Province Name
localityName                    = Locality Name
0.organizationName              = Organization Name
organizationalUnitName          = Organizational Unit Name
commonName                      = Common Name
emailAddress                    = Email Address

# Optionally, specify some defaults.
countryName_default             = ES
stateOrProvinceName_default     = Barcelona
localityName_default            = Barcelona
0.organizationName_default      = GRG-CAISSUING-CA-2023
#organizationalUnitName_defaultorganizationalUnitName_default	= GRG-ISSUING-CA-2023
#emailAddress_default           =

[ v3_cacrl_ext ]
# ExtensionsExtension for a typical CACRLs (`man x509v3_config`).
subjectKeyIdentifierauthorityKeyIdentifier=keyid:always

[ issuing_crl_info ]
fullname = hashURI: authorityKeyIdentifierhttp://pki.psc.lan/grg-sub-ca-2023.crl, =URI:http://pki.driverlandia.com/grg-sub-ca-2023.crl, keyid:always,issuerURI:http://ca.driverlandia.com/grg-sub-ca-2023.crl

basicConstraints####################################################################
=## critical,FINAL CA:trueCERTIFICATES keyUsageCONFIG
= critical, digitalSignature, cRLSign, keyCertSign

[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign####################################################################

[ usr_cert ]
# Extensions for client certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = client, email
nsComment = "OpenSSL Generated Client Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection
crlDistributionPoints 	= issuing_crl_info

[ server_cert ]
# Extensions for server certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
[ ocsp ]
# Extension for OCSP signing certificates (`man ocsp`).
basicConstraintscrlDistributionPoints 	= CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning

[ crl_ext ]
# Extension for CRLs (`man x509v3_config`).
authorityKeyIdentifier=keyid:always

[ crl_info ]
URI.0 = http://pki.driverlandia.com/sub-ca.crl
URI.1 = https://www.driverlandia.com/pki/sub-ca.crlissuing_crl_info

De

Crearesta claveforma privadaya tendrá preparada la Intermediate CA para firmar a los nodos finales. Puede ver que las CRL definidas en el bloque [ issuing_crl_info ] son diferentes a las definidas en el fichero root-ca-openssl.cnf, ya que los nodos finales al ser firmados por la Intermediate CA, serán revocados por dicha Intermediate CA.

En otras palabras, para comprobar si un certificado final es válido, el sistema que vaya a consultar la web, validar si el equipo sigue siendo valido, consultará la CRL de la SUBIntermediate, CA

pero

Ahoratambién va a crearconsultará la clave privada de la Entidad Subordinada de Certificación. Tal y como pasa con la clave de privadaCRL de la Root CA (y como con cualquier clave privada) es importante que nadie tenga acceso a ella, puesto que con dicha clave se podrán firmar certificados para el entorno.

cd /root/ca
openssl genrsa -aes256 \
      -out intermediate/private/intermediate.key.pem 4096

Se le solicitará insertar una contraseña para salvaguardar la clave privada. Introduzca una diferente a la que uso para la clave privada de la Root.

A continuación, modifique los permisos para que solo los usuarios con permisos de root (los administradores de la PKI) puedan leer dicho fichero

chmod 400 intermediate/private/intermediate.key.pem

Crear certificado público de la SUB CA

Ahora ha de crear el certificado público que identificará a la SUBCA, pero a diferencia de lo que ha realizado con la Root CA, la Subca no debe firmarse a sí misma (ya que entoncessi seríase otrainvalida Rootla CA)Intermediate, todos los certificados firmados por ella serán automáticamente inválidos).

cd /root/ca
openssl req -config intermediate/sub-ca-openssl.cnf -new -sha512 \
      -key intermediate/private/intermediate.key.pem \
      -out intermediate/csr/intermediate.csr.pem

Introduzca la contraseña que ha generado en el paso anterior (la privada de la SUBCA). A continuación introduzca los datos que se le piden. Los que vengan por defecto, dejelos igual, ya que han de coincidir con los de la Root CA.

Copie el fichero CSR generado en la ruta intermediate/csr/intermediate.csr.pem y subalo al servidor de la Root CA.

En el servidor de la Root CA proceda con la firma y generación del certificado de la SubCA. Suponiendo que ha subido el fichero CSR a la carpeta /root/intermediate.csr.pem de la RootCA, ejecute el siguiente comando

cd /root/ca
openssl ca -config root-ca-openssl.cnf -extensions v3_intermediate_ca \
      -days 3650 -notext -md sha512 \
      -in /root/intermediate.csr.pem \
      -out /root/intermediate.cert.pem

Se le solicitará la contraseña de la clave privada de la Root CA.

Modifique los permisos del fichero para que pueda ser legible por los usuarios.

chmod 444 root/intermediate.cert.pem

Una vez firmado, en el contenido del fichero root-ca-database.txt podrá ver que se ha generado un nuevo registro. No elimine bajo ningún concepto el registro o el fichero.

Verifique los datos del certificado

openssl x509 -noout -text -in /root/intermediate.cert.pem

Como Issuer deberá aparecer la Root CA y las fechas de validación deberán ser las correctas. (Recordar que la subca ha sido firmada para 3650 dias = 10 años)

También ha de aparecer el campo CA: TRUE (ya que está siendo firmada para una SUB CA)

Verifique la cadena de certificación

cd /root/ca
openssl verify -CAfile certs/root-ca.cert.pem /root/intermediate.cert.pem

Descargue los ficheros root-ca.cert.pem, /root/intermediate.cert.pem y copielos en el servidor de la SUBCA.

Instale el certificado de la Root CA en el servidor SUB CA

cp root-ca.cert.pem /etc/ssl/certs/ -v
ln -s /etc/ssl/certs/root-ca.cert.pem /usr/local/share/ca-certificates/root-ca.cert.pem
update-ca-certificates --fresh

Finalmente elimine el fichero CSR de la intermedia en el servidor Root CA y en el Servidor SubCA.

rm /root/intermediate.csr.pem

Generar Certificado FullChain

Si desea también puede generar un certificado con ambos (fullchain) ya que algunas aplicaciones necesitan tener toda la cadena de certificación para dar como válido el certificado.

cat intermediate.cert.pem root-ca.cert.pem > full-chain.pem

Aunque por lo general, si el equipo tiene instalado el certificado de la Root CA en su repositorio de Trusted Authorities, no debería ser necesario.

Fuente: