View a markdown version of this page

Revocación de certificados - Amazon CloudFront

Revocación de certificados

Cuando es necesario revocar los certificados (debido a un compromiso, a cambios en las políticas o a la rescisión de una relación), se necesita un mecanismo para rechazar esos certificados durante el establecimiento de comunicación de mTLS. CloudFront ofrece dos enfoques nativos para la revocación de certificados y puede combinarlos para obtener un control por capas.

  • OCSP (Protocolo de estado de certificados en línea): CloudFront consulta al respondedor OCSP de la autoridad de certificación en tiempo real para comprobar si se ha revocado un certificado de cliente. Habilite OCSP en su almacén de confianza y CloudFront gestionará la validación automáticamente durante el establecimiento de comunicación de TLS. Los resultados del OCSP también están visibles en funciones de conexión, lo que permite acceder mediante programación al estado de revocación para tomar decisiones personalizadas.

  • CloudFront Functions y KeyValueStore: mantenga una lista de los números de serie de certificados revocados en un KeyValueStore de CloudFront. La función de conexión consulta KeyValueStore durante el establecimiento de comunicación de TLS y permite o deniega la conexión. Esto concede el control total sobre los datos de revocación, el tiempo de actualización y la lógica personalizada, como los periodos de gracia o las excepciones basadas en IP.

Comparación: OCSP frente a CloudFront Functions con KeyValueStore
OCSP CloudFront Functions + KeyValueStore
Origen de datos Respondedor de OCSP de la autoridad de certificación Se administra la lista de revocaciones
Actualización de mecanismo Consulta en tiempo real a la autoridad de certificación Se ingresan actualizaciones en KeyValueStore
Lógica personalizada Disponible a través de funciones de conexión Integrado en el código de función
Dependencia externa Requiere la disponibilidad del respondedor de OCSP de la autoridad de certificación Sin dependencia externa
Lo mejor para Las autoridades de certificación que mantienen los respondedores de OCSP; estado autorizado de la autoridad de certificación en tiempo real Revocación autoadministrada; políticas personalizadas; autoridades de certificación sin soporte para OCSP

Puede utilizar ambos enfoques juntos. Habilite OCSP para la comprobación de revocaciones por parte de la autoridad de certificación autorizada y, a continuación, utilice una función de conexión para agregar lógica adicional al resultado de OCSP, por ejemplo, permitiendo la revocación de certificados de rangos de IP de confianza durante un periodo de gracia.

OCSP (Protocolo de estado de certificados en línea)

El OCSP es un protocolo en tiempo real que comprueba el estado de revocación de un certificado directamente con la autoridad de certificación (CA). Durante el proceso de firma del certificado, la autoridad de certificación incorpora una URL de respuesta de OCSP en el certificado. Cuando un cliente presenta su certificado durante el establecimiento de comunicación de mTLS, CloudFront envía una solicitud de OCSP a la URL del respondedor integrado y actúa en función de la respuesta: los certificados válidos continúan y los certificados revocados se terminan.

CloudFront valida toda la cadena de certificados (el certificado de hoja y hasta tres certificados intermedios), cada uno con sus respectivas URL de respuesta de OCSP. Los certificados raíz del almacén de confianza se excluyen de la validación de OCSP.

Habilitación de OCSP

Habilite OCSP en su almacén de confianza. Cuando está habilitado, CloudFront realiza automáticamente la validación de OCSP para cualquier certificado de cliente que contenga una URL de respuesta de OCSP en su extensión Acceso a la información de la autoridad (AIA). Una vez que se habilita el OCSP, toda la cadena de certificados del cliente debe tener una URL de OCSP. Si algún certificado de la cadena de certificados del cliente no contiene una URL de OCSP, CloudFront no establecerá la conexión.

CloudFront almacena en caché las respuestas de OCSP en la periferia para reducir el tiempo de ida y vuelta y proteger contra el tiempo de inactividad del respondedor de OCSP. Las respuestas del OCSP se almacenan en caché durante aproximadamente 30 minutos y el estado de revocación actualizado puede tardar hasta 30 minutos en reflejarse.

El OCSP genera funciones de conexión

Cuando se configura una función de conexión en la misma distribución, CloudFront la invoca una vez finalizada la validación de OCSP. El objeto de conexión contiene el estado de OCSP de los certificados de hoja e intermedios:

{ "clientCertificate": { "certificates": { "leaf": { "subject": "CN=client.example.com, O=Example Org", "issuer": "CN=Intermediate CA, O=Example Org", "serialNumber": "00:a7:30:9e:73:7b:3e:63:bd:b7:c0:7e:bf:d5:c9:86", "validity": { "notBefore": "2024-01-01T00:00:00Z", "notAfter": "2025-01-01T00:00:00Z" }, "sha256Fingerprint": "AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90", "ocspEndpoint": "http://ocsp.example.org" }, "intermediates": [ { "subject": "CN=Intermediate CA, O=Example Org", "issuer": "CN=Root CA, O=Example Org", "serialNumber": "00:a7:30:9e:73:7b:3e:63:bd:b7:c0:7e:bf:d5:c9:86", "validity": { "notBefore": "2020-01-01T00:00:00Z", "notAfter": "2030-01-01T00:00:00Z" }, "sha256Fingerprint": "12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF", "ocspEndpoint": "http://ocsp.example.org" } ] }, "revocationStatus": { "chainValidity": "Valid", // "Valid" | "Invalid" | "Unknown" "certificates": { "leaf": { "method": "OCSP", // "OCSP" "status": "Good", // "Good" | "Revoked" | "Unknown" | "Error" "serialNumber": "00:a7:30:9e:73:7b:3e:63:bd:b7:c0:7e:bf:d5:c9:86" }, "intermediates": [ { "method": "OCSP", // "OCSP" "status": "Error", // "Good" | "Revoked" | "Unknown" | "Error" "errorType": "InternalError", // "InternalError" | "OCSP response verification failed: {Type}" "serialNumber": "00:a7:30:9e:73:7b:3e:63:bd:b7:c0:7e:bf:d5:c9:86" } ] } } }, "clientIp":"127.0.0.1", "endpoint":"d123.cloudfront.net", "distributionId":"E1NXS4MQZH501R", "connectionId":"xdzQ6lJUDUt8b7OuqOD8lmzOC9HcMaXPmhH5ZdzLCZpKxqzfCPpR4A==" }

El campo chainValidity puede ser Valid, Invalid o Unknown. Los valores status de los certificados individuales pueden ser Good, Revoked, Unknown o Error. El campo errorType contiene InternalError o OCSP response verification failed: {Type} cuando el estado es Error.

La función de conexión puede invalidar el resultado del OCSP, por ejemplo, al permitir la revocación de un certificado de un rango de IP de confianza o al denegar un certificado que el OCSP considera “bueno” basándose en una lógica empresarial adicional.

nota

El campo errorType solo estará presente si el estado es Error.

Ejemplo: Manejo de OCSP personalizado con una excepción de IP fiable

function connectionHandler(connection) { var revocationStatus = connection.clientCertificate.revocationStatus; var trustedIP = (connection.clientIp === "[IP_ADDRESS]"); if (revocationStatus.chainValidity === "Invalid") { if (trustedIP) { connection.allow(); } else { connection.deny(); } } else if (revocationStatus.certificates.leaf.status === "Error") { console.log(revocationStatus.certificates.leaf.errorType); connection.deny(); } else { connection.allow(); } }

Comportamiento de error de OCSP

Cuando CloudFront no puede determinar el estado de revocación de un certificado (porque no se puede acceder al respondedor de OCSP, devuelve un error o devuelve “desconocido”), CloudFront deniega la conexión de forma predeterminada. Para implementar un comportamiento de error leve, utilice una función de conexión. Las funciones de conexión no se ejecutarán si el OCSP está activado y la URL del OCSP no aparece en los certificados del cliente. El resultado del OCSP está disponible en el objeto de conexión y la función puede permitir conexiones cuando el estado del OCSP no esté determinado:

async function connectionHandler(connection) { var revocationStatus = connection.clientCertificate.revocationStatus; if (revocationStatus.certificates.leaf.status === "Error" || revocationStatus.certificates.leaf.status === "Unknown") { // OCSP responder unreachable — allow connection (soft-fail) connection.logCustomData(`OCSP_SOFT_FAIL:${revocationStatus.certificates.leaf.errorType}`); return connection.allow(); } if (revocationStatus.chainValidity === "Invalid") { return connection.deny(); } return connection.allow(); }

Revocación de certificados con CloudFront Functions y KeyValueStore

Puede utilizar funciones de conexión de CloudFront con KeyValueStore para implementar la comprobación de revocación de certificados sin ninguna dependencia externa. Se mantiene una lista de números de serie de los certificados revocados en un KeyValueStore y la función de conexión compara cada certificado de cliente con esta lista durante el establecimiento de comunicación de TLS.

El proceso de revocación de certificados funciona de la siguiente manera:

  1. Guarde los números de serie de los certificados revocados en un KeyValueStore de CloudFront.

  2. Cuando un cliente presenta un certificado, se invoca la función de conexión.

  3. La función compara el número de serie del certificado con el KeyValueStore.

  4. Si el número de serie se encuentra en la tienda, se revoca el certificado.

  5. Su función deniega la conexión en el caso de los certificados revocados.

Este enfoque permite comprobar las revocaciones prácticamente en tiempo real en toda la red de periferia global de CloudFront.

Para implementar este enfoque, necesita lo siguiente:

  • Una distribución configurada con un mTLS de espectador

  • Un KeyValueStore que contenga números de serie de certificados revocados

  • Una función de conexión que consulta el KeyValueStore para comprobar el estado del certificado

Cuando un cliente se conecta, CloudFront valida el certificado con el almacén de confianza y, a continuación, ejecuta la función de conexión. La función compara el número de serie del certificado con el KeyValueStore y permite o deniega la conexión.

Paso 1: crear un KeyValueStore para los certificados revocados

Prepare los números de serie de los certificados revocados en formato JSON:

{ "data": [ { "key": "ABC123DEF456", "value": "" }, { "key": "789XYZ012GHI", "value": "" } ] }

Cargue este archivo JSON en un bucket de S3 y, a continuación, cree el KeyValueStore:

aws s3 cp revoked-serials.json s3://your-bucket-name/revoked-serials.json aws cloudfront create-key-value-store \ --name revoked-serials-kvs \ --import-source '{ "SourceType": "S3", "SourceARN": "arn:aws:s3:::your-bucket-name/revoked-serials.json" }'

Espere a que el KeyValueStore termine de aprovisionarse. Compruebe el estado con:

aws cloudfront get-key-value-store --name "revoked-serials-kvs"

Paso 2: crear la función de conexión de revocación

Cree una función de conexión que compruebe los números de serie de los certificados con el KeyValueStore:

aws cloudfront create-connection-function \ --name "revocation-control" \ --connection-function-config file://connection-function-config.json \ --connection-function-code file://connection-function-code.txt

El archivo de configuración especifica la asociación de KeyValueStore:

{ "Runtime": "cloudfront-js-2.0", "Comment": "A function that implements revocation control via KVS", "KeyValueStoreAssociations": { "Quantity": 1, "Items": [ { "KeyValueStoreArn": "arn:aws:cloudfront::account-id:key-value-store/kvs-id" } ] } }

Código de función de conexión de ejemplo:

import cf from 'cloudfront'; async function connectionHandler(connection) { const kvsHandle = cf.kvs(); // Get client serial number from client certificate const clientSerialNumber = connection.clientCertificate.certificates.leaf.serialNumber; // Check KVS to see if serial number exists as a key // Remove : from the clientSerialNumber if KVS entries dont have it const serialNumberExistsInKvs = await kvsHandle.exists(clientSerialNumber.replaceAll(":", "")); // Deny connection if serial number exists in KVS if (serialNumberExistsInKvs) { console.log("Connection denied — certificate revoked"); connection.logCustomData("Connection denied — certificate revoked"); return connection.deny(); } // Allow connections that don't exist in KVS console.log("Connection allowed"); return connection.allow(); }

Paso 3: probar la función de revocación

Utilice la consola de CloudFront para probar la función de conexión con certificados de ejemplo. Navegue hasta la función de conexión en la consola y utilice la pestaña Probar.

  • Pegue un certificado de ejemplo en formato PEM en la interfaz de prueba.

  • Si lo desea, especifique una dirección IP de cliente para probar la lógica basada en IP.

  • Elija Función de prueba para consultar los resultados de ejecución.

  • Revise los registros de ejecución para verificar la lógica de la función.

Realice pruebas con certificados válidos y revocados para asegurarse de que la función gestiona ambos escenarios correctamente.

Paso 4: asocie la función a la distribución

Una vez que publique la función de conexión, asóciela a la distribución compatible con mTLS para activar la comprobación de revocación de certificados. Vaya a la configuración de distribución, vaya a la sección “Autenticación mutua del espectador (mTLS)”, seleccione la función de conexión y guarde los cambios.

Estrategias de revocación avanzadas

Combinación del OCSP con la lógica de la función de conexión

Puede habilitar el OCSP para la comprobación de revocaciones por parte de la autoridad de certificación autorizada y agregar una función de conexión para las políticas personalizadas. La función de conexión recibe el resultado del OCSP y puede aplicar una lógica adicional:

  • Periodos de gracia: permite la revocación de certificados de redes internas durante un periodo definido durante la rotación de certificados.

  • Acceso de emergencia: permita las conexiones desde direcciones IP específicas incluso cuando el OCSP informe de que está revocado.

  • Lógica de denegación personalizada: bloquee los certificados que OCSP considere “buenos” en función de sus propios datos de revocación en KeyValueStore.

ejemplo Revocación combinada OCSP + KVS
import cf from 'cloudfront'; async function connectionHandler(connection) { var kvsHandle = cf.kvs(); var revocationStatus = connection.clientCertificate.revocationStatus; var serialNumber = connection.clientCertificate.certificates.leaf.serialNumber; // Check your own revocation list first (immediate revocation, no cache delay) var inKvs = await kvsHandle.exists(serialNumber.replaceAll(":", "")); if (inKvs) { connection.logCustomData("KVS_REVOKED:" + serialNumber); return connection.deny(); } // Then check OCSP result if (revocationStatus.chainValidity === 'Valid' && revocationStatus.certificates.leaf.status === "Revoked") { // OCSP says revoked — allow grace period from trusted IPs if (connection.clientIp.startsWith("10.0.")) { connection.logCustomData("GRACE_PERIOD:" + serialNumber + ":" + connection.clientIp); return connection.allow(); } connection.logCustomData("OCSP_REVOKED:" + serialNumber); return connection.deny(); } connection.allow(); }

Este patrón permite la revocación inmediata mediante KVS (sin retraso de la caché) más la revocación de la autoridad de certificación autorizada mediante OCSP, con una gestión de excepciones personalizada de por medio.