Infraestructura de Clave Pública (PKI) Básica en Criptografía

LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, explorará los fundamentos de la Infraestructura de Clave Pública (PKI, por sus siglas en inglés), el sistema que sustenta gran parte de la seguridad en internet, incluido HTTPS. La PKI es un conjunto de roles, políticas, hardware, software y procedimientos necesarios para crear, gestionar, distribuir, utilizar, almacenar y revocar certificados digitales, y para gestionar el cifrado de clave pública.

Obtendrá experiencia práctica con la herramienta de línea de comandos openssl para realizar las funciones principales de una PKI. Actuará como su propia Autoridad de Certificación (CA), emitirá un certificado para un servidor web, verificará la cadena de confianza del certificado y, finalmente, revocará el certificado. Todas las operaciones se realizarán dentro del directorio ~/project.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 96%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Comprensión de los Fundamentos de PKI

En este paso, cubriremos los conceptos fundamentales de la PKI. No hay comandos que ejecutar en este paso; el objetivo es construir una base teórica sólida antes de comenzar la práctica práctica.

Infraestructura de Clave Pública (PKI)

La PKI es un marco diseñado para mejorar la seguridad en las comunicaciones electrónicas. Utiliza la criptografía de clave pública para vincular las claves públicas con las identidades de usuario respectivas mediante una Autoridad de Certificación (CA). Esta vinculación se establece a través de un proceso de registro y emisión.

Autoridad de Certificación (CA)

Una Autoridad de Certificación es una entidad de confianza que emite certificados digitales. La CA actúa como un tercero de confianza, confiable tanto por el sujeto (propietario) del certificado como por la parte que confía en el certificado. El papel principal de la CA es firmar digitalmente y publicar la clave pública vinculada a un usuario determinado.

Certificado Digital

Un certificado digital es un documento electrónico (a menudo siguiendo el estándar X.509) que contiene:

  • La clave pública del propietario.
  • La información de identificación del propietario (como un nombre o nombre de host).
  • La información y la firma digital del emisor (la CA).
  • Un período de validez (fecha de inicio y fin).
  • Un número de serie único.

La firma de la CA en el certificado da fe de que la clave pública contenida en el certificado pertenece a la entidad nombrada en el certificado.

Cadena de Confianza

Una cadena de confianza (o cadena de certificados) es una secuencia de certificados, que comienza con un certificado de entidad final (por ejemplo, para example.com) y termina con un certificado de CA raíz.

  1. Certificado de CA Raíz (Root CA): Este es un certificado autofirmado de la autoridad máxima, la CA Raíz. Estos certificados están preinstalados en la "tienda de confianza" (trust store) de su navegador o sistema operativo.
  2. Certificado(s) de CA Intermedia: Las CA grandes a menudo utilizan CA intermedias para emitir certificados a los usuarios finales, protegiendo así la clave raíz. Un certificado intermedio es firmado por la CA raíz.
  3. Certificado de Entidad Final: Este es el certificado emitido a un servidor o usuario específico. Es firmado por una CA intermedia (o directamente por la CA raíz en configuraciones más simples).

Cuando su navegador recibe el certificado de un servidor, verifica la firma comprobando el certificado del emisor. Sigue esta cadena hasta que alcanza una CA raíz que ya está en su tienda de confianza. Si la cadena es válida y todas las firmas coinciden, se considera que el servidor es de confianza.

En el siguiente paso, creará su propia CA Raíz.

Crear una Autoridad de Certificación

En este paso, actuará como una Autoridad de Certificación (CA) y creará sus componentes fundamentales: una clave privada y un certificado raíz autofirmado. Todos los comandos se ejecutarán en la terminal, y todos los archivos se crearán en su directorio actual, ~/project.

Primero, genere la clave privada de la CA. Esta clave es el secreto más crítico de la PKI; se utiliza para firmar todos los certificados emitidos por la CA.

openssl genpkey -algorithm RSA -out ca.key

A continuación, creará un certificado raíz autofirmado. Un certificado raíz es autofirmado porque es el ancla de confianza definitiva; no hay una autoridad superior que lo firme.

Ejecute el siguiente comando para generar el certificado. Usamos el argumento -subj para proporcionar la información del sujeto del certificado de forma no interactiva.

openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.pem -subj "/C=US/ST=California/L=MountainView/O=MyLab/CN=MyLabRootCA"

Analicemos este comando:

  • req: Utilidad para la Solicitud de Firma de Certificado (CSR) y generación de certificados.
  • -x509: Genera un certificado autofirmado en lugar de una CSR.
  • -new: Crea un nuevo certificado.
  • -nodes: "No DES", lo que significa que la clave privada no se cifrará con una contraseña (passphrase). Esto es por simplicidad en nuestro laboratorio.
  • -key ca.key: Especifica la clave privada a utilizar para la firma.
  • -sha256: Utiliza el algoritmo hash SHA-256 para la firma.
  • -days 365: Establece el período de validez del certificado en 365 días.
  • -out ca.pem: Especifica el archivo de salida para el nuevo certificado.
  • -subj "/C=.../CN=...": Proporciona los detalles del sujeto. CN (Common Name, Nombre Común) es la identidad principal, que para una CA es su nombre.

Ahora tiene una clave privada de CA (ca.key) y un certificado raíz (ca.pem). Puede inspeccionar el contenido de su nuevo certificado de CA:

openssl x509 -in ca.pem -text -noout

Desplácese por la salida y observe que los campos Issuer (Emisor) y Subject (Sujeto) son idénticos, lo que confirma que está autofirmado.

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            ...
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = California, L = MountainView, O = MyLab, CN = MyLabRootCA
        Validity
            Not Before: ...
            Not After : ...
        Subject: C = US, ST = California, L = MountainView, O = MyLab, CN = MyLabRootCA
        Subject Public Key Info:
            ...

Emitir un Certificado de Servidor

En este paso, simulará ser el propietario de un servidor que solicita un certificado. Generará una clave privada y una Solicitud de Firma de Certificado (CSR) para el servidor, y luego utilizará su CA del paso anterior para firmar la CSR y emitir un certificado válido.

Primero, genere una clave privada para el servidor. Esta clave debe mantenerse en secreto en el propio servidor.

openssl genpkey -algorithm RSA -out server.key

A continuación, cree una Solicitud de Firma de Certificado (CSR). Una CSR es un bloque de texto codificado que contiene la clave pública y otra información que se incluirá en el certificado, como el nombre de la organización y el nombre de dominio. La CSR se envía a la CA para su firma.

openssl req -new -key server.key -out server.csr -subj "/C=US/ST=California/L=MountainView/O=MyWebServer/CN=example.com"

Tenga en cuenta que para un certificado de servidor, el CN (Common Name, Nombre Común) debe coincidir con el nombre de dominio del servidor, en este caso, example.com.

Ahora, actuando como la CA, firmará la CSR del servidor (server.csr) con la clave privada de su CA (ca.key). Esta acción crea el certificado de servidor final (server.crt).

openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.crt -days 300 -sha256

Repasemos las nuevas opciones:

  • x509 -req: Esto indica a OpenSSL que procese una CSR.
  • -in server.csr: El archivo CSR de entrada.
  • -CA ca.pem: El certificado de la CA a utilizar como emisor.
  • -CAkey ca.key: La clave privada de la CA para la firma.
  • -CAcreateserial: Esto crea y gestiona un archivo de número de serie (ca.srl), que es necesario para garantizar que cada certificado emitido por la CA tenga un número de serie único.
  • -days 300: La validez para el certificado del servidor. Esto debe ser más corto que la validez del certificado de la CA.

Finalmente, inspeccione el certificado de servidor recién creado.

openssl x509 -in server.crt -text -noout

En la salida, observe los campos Issuer (Emisor) y Subject (Sujeto). El Issuer debe ser su CA (MyLabRootCA), y el Subject debe ser su servidor (example.com). Esto confirma que el certificado fue emitido correctamente por su CA.

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: ...
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = California, L = MountainView, O = MyLab, CN = MyLabRootCA
        Validity
            Not Before: ...
            Not After : ...
        Subject: C = US, ST = California, L = MountainView, O = MyWebServer, CN = example.com
        ...
    Signature Algorithm: sha256WithRSAEncryption
         ...

Verificar la Cadena de Certificados

En este paso, aprenderá cómo verificar una cadena de certificados. Este es el proceso que realiza un cliente (como un navegador web) para determinar si el certificado de un servidor es confiable. El cliente comprueba si el certificado fue firmado por una CA en la que confía.

Puede utilizar el comando openssl verify para realizar esta comprobación. Debe indicarle a OpenSSL qué CAs confía proporcionando el certificado raíz.

Ejecute el siguiente comando para verificar server.crt contra su certificado raíz ca.pem:

openssl verify -CAfile ca.pem server.crt

La salida debería ser:

server.crt: OK

Este estado OK confirma que:

  1. El certificado server.crt fue firmado efectivamente por la clave privada correspondiente a la clave pública en ca.pem.
  2. El certificado no ha expirado.

Ahora, veamos qué sucede si el verificador no tiene nuestra CA en su lista de CAs confiables. Puede simular esto ejecutando el comando verify sin la opción -CAfile.

openssl verify server.crt

Esta vez, el comando fallará con un error similar a este:

C = US, ST = California, L = MountainView, O = MyWebServer, CN = example.com
error 20 at 0 depth lookup: unable to get local issuer certificate
error server.crt: verification failed

El error "unable to get local issuer certificate" (no se puede obtener el certificado del emisor local) significa que el sistema no pudo encontrar el certificado del emisor (MyLabRootCA) en su almacén de confianza predeterminado. Esto demuestra por qué es esencial que los clientes tengan el certificado de la CA raíz para establecer una cadena de confianza.

Simular la Revocación del Certificado

En este paso, aprenderá cómo revocar un certificado. La revocación es un proceso crítico para cuando la clave privada de un certificado se ve comprometida, o el certificado ya no es necesario antes de su expiración natural. Esto se gestiona mediante una Lista de Revocación de Certificados (CRL).

Una CRL es una lista firmada digitalmente, emitida por una CA, que contiene los números de serie de todos los certificados que ha revocado. Los clientes pueden descargar la CRL para comprobar si un certificado que han recibido sigue siendo válido.

Para gestionar la revocación, openssl necesita un pequeño archivo de configuración para saber dónde encontrar los archivos de la base de datos de la CA (index.txt y serial). El script de configuración para este laboratorio ya ha creado el directorio necesario (my-ca) y los archivos. Ahora, cree el archivo de configuración.

Utilice el comando cat para crear my-ca.conf:

cat << EOF > my-ca.conf
[ ca ]
default_ca = CA_default

[ CA_default ]
dir = ./my-ca
database = \$dir/index.txt
serial = \$dir/serial
private_key = ca.key
certificate = ca.pem
default_md = sha256
policy = policy_anything
crl_extensions = crl_ext
default_crl_days = 30

[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

[ crl_ext ]
authorityKeyIdentifier=keyid:always
EOF

Este archivo de configuración le indica a OpenSSL cómo operar como una Autoridad de Certificación. Esto es lo que hace cada sección:

  • default_ca = CA_default: Señala a la sección de configuración principal de la CA.
  • dir = ./my-ca: Directorio de trabajo de la CA para los archivos de la base de datos
  • database = $dir/index.txt: Base de datos de certificados (rastrea certificados emitidos/revocados)
  • serial = $dir/serial: Archivo de número de serie para identificadores de certificados únicos
  • private_key = ca.key: Clave privada de la CA para firmar certificados
  • certificate = ca.pem: Archivo del propio certificado de la CA
  • default_md = sha256: Algoritmo hash para firmas (SHA-256)
  • policy = policy_anything: Reglas de validación de certificados
  • crl_extensions = crl_ext: Opciones de formato de CRL
  • default_crl_days = 30: Período de validez de la CRL (30 días)
  • countryName = optional: Código de país
  • stateOrProvinceName = optional: Estado/provincia
  • localityName = optional: Ciudad/ubicación
  • organizationName = optional: Nombre de la organización
  • organizationalUnitName = optional: Departamento
  • commonName = supplied: Nombre de dominio/servidor (requerido)
  • emailAddress = optional: Dirección de correo electrónico
  • authorityKeyIdentifier=keyid:always: Incluye el identificador de la CA en las CRL para su verificación

Este archivo de configuración es el "manual de operaciones" para su CA. Le dice a OpenSSL dónde encontrar las claves, cómo almacenar los certificados y qué reglas seguir para emitir y revocar certificados.

Ahora, revoque el certificado del servidor (server.crt). Este comando buscará el número de serie del certificado y lo marcará como revocado en el archivo de base de datos index.txt.

openssl ca -config my-ca.conf -revoke server.crt

Verá una salida que confirma la revocación.

Después de revocar, debe generar y publicar una CRL actualizada.

openssl ca -config my-ca.conf -gencrl -out my-ca.crl

Esto crea el archivo my-ca.crl, que contiene la lista de certificados revocados.

Finalmente, intentemos verificar el certificado del servidor nuevamente, pero esta vez, también proporcionaremos la CRL. Un proceso de verificación adecuado debe comprobar la revocación.

openssl verify -CAfile ca.pem -CRLfile my-ca.crl -crl_check server.crt

El comando ahora falla con un mensaje claro:

C = US, ST = California, L = MountainView, O = MyWebServer, CN = example.com
error 23 at 0 depth lookup: certificate revoked
error server.crt: verification failed

El error "certificate revoked" (certificado revocado) confirma que nuestro proceso de revocación fue exitoso. El cliente, al verificar la CRL, identificó correctamente que el certificado para example.com ya no es confiable.

Resumen

¡Felicidades! Ha completado con éxito este laboratorio sobre los fundamentos de la Infraestructura de Clave Pública (PKI). Ha adquirido experiencia práctica con las operaciones fundamentales que aseguran las comunicaciones digitales.

En este laboratorio, ha aprendido a:

  • Comprender los conceptos centrales de PKI, Autoridades de Certificación (CA) y cadenas de confianza.
  • Crear su propia CA Raíz simple generando una clave privada y un certificado autofirmado.
  • Emitir un certificado de servidor firmando una Solicitud de Firma de Certificado (CSR) con la clave de su CA.
  • Verificar la cadena de confianza de un certificado utilizando el comando openssl verify.
  • Revocar un certificado y confirmar su estado de revocación generando y utilizando una Lista de Revocación de Certificados (CRL).

Estas habilidades son los componentes básicos para gestionar sistemas seguros y comprender cómo se establece la confianza en Internet.