Clicky

El grapado (stapling) de OCSP en Apache

grapado OCSO en Apache

Este mecanismo evita un ida y vuelta entre el cliente y el servidor OCSP

Cuando se conectan a un servidor los clientes deben verificar la validez del certificado del servidor utilizando una lista de revocación de certificados (CRL - Certificate Revocation List), o un registro Online Certificate Status Protocol (OCSP). El problema con la CRL es que las listas han crecido enormemente y se tarda una eternidad en descargar.

OCSP es mucho más ligero, ya que sólo se recupera a la vez un registro. Pero el efecto secundario es que las peticiones OCSP deben hacerse a una tercera parte de OCSP de respuesta cuando se conecta a un servidor, lo que añade latencia y los posibles fallos. De hecho, los respondedores OCSP operados por entidades emisoras son a menudo tan poco fiables y en el navegador se producirá un error silencioso si no se recibe respuesta en tiempo y forma. Esto reduce la seguridad al permitir a un atacante de DoS un respondedor OCSP para desactivar la validación.

La solución es permitir que el servidor envíe su historial de OCSP en caché durante el protocolo de enlace TLS sin pasar, por lo tanto, por el servidor OCSP. Este mecanismo evita un ida y vuelta entre el cliente y el servidor OCSP, y se llama OCSP grapado.

El servidor enviará una respuesta OCSP en caché sólo si el cliente lo solicita, con el anuncio de soporte a la extensión TLS status_request en su CLIENT HELLO.

La mayoría de los servidores van a almacenar en caché la respuesta OCSP hasta por 48 horas. A intervalos regulares, el servidor se conectará al servidor OCSP de la CA para recuperar un registro de OCSP fresco. La ubicación del servidor OCSP se toma del campo de Acceso a la información del certificado firmado.

¿Qué es el grapado de OCSP?

El grapado OCSP se define en el RFC 6066 del IETF. El término "grapado" es un término popular utilizado para describir cómo se obtiene la respuesta OCSP por el servidor web. El servidor web almacena en caché la respuesta de la CA que emitió el certificado. Cuando se inicia un protocolo de enlace SSL/TLS, la respuesta es devuelta por el servidor web al cliente adjuntando la respuesta OCSP en caché al mensaje CertificateStatus. Para hacer uso de OCSP grapado, un cliente debe incluir la extensión "status_request" con su mensaje al cliente SSL/TSL "Hello".

El  grapado OCSP presenta varias ventajas, incluyendo las siguientes:

• La parte que confía recibe el estado del certificado de servidores web cuando es necesario (durante el protocolo de enlace SSL/TLS).
• No se necesita ser establecida una conexión HTTP adicional con la entidad emisora.
• OCSP grapado proporciona mayor seguridad al reducir el número de vectores de ataque.

Lee uno de los siguientes enlaces para obtener más información sobre OCSP y grapado OCSP.

Requisitos

Para que esto funcione se necesita al menos Apache 2.3.3 o posterior, OpenSSL 0.9.8h o posterior. No está disponible en las versiones actuales de Ubuntu LTS (12.04), que tiene Apache 2.2.22 y CentOS 6 que tiene Apache 2.2.15 . O bien busca repositorios no oficiales/PPA para compilarlo tu mismo.

También es necesario crear una excepción de firewall para permitir que el servidor haga las conexiones salientes a la OCSP. Puedes ver todos OCSP URI's de un sitio web que utiliza estas líneas:

OLDIFS=$IFS; IFS=':' certificates=$(openssl s_client -connect google.com:443 -showcerts -tlsextdebug -tls1 2>&1 </dev/null | sed -n '/-----BEGIN/,/-----END/ {/-----BEGIN/ s/^/:/; p}'); for certificate in ${certificates#:}; do echo $certificate | openssl x509 -noout -ocsp_uri; done; IFS=$OLDIFS

Es el resultado de google.com en:

http://clients1.google.com/ocsp
http://gtglobal-ocsp.geotrust.com

Reemplaza google.com con tu dominio. También ten en cuenta que necesitas la versión GNU de sed y bash. No funciona en OS X o BSD.

Configuración de Apache

Añade la configuración en su host virtual a continuación:

SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

Aquí está la explicación de las dos líneas:

SSLUseStapling

El grapado OCSP alivia el cliente de consulta de la respuesta OCSP por sí solo, pero hay que señalar que con la especificación RFC 6066, CertificateStatus la respuesta del servidor sólo puede incluir una respuesta OCSP para un solo certificado. Para los certificados de servidor con certificados CA intermedios en su cadena (el caso típico de hoy en día), grapado en su implementación actual, por tanto, sólo alcanza parcialmente el objetivo declarado de "ida y vuelta y el ahorro de recursos" - véase también el RFC 6961 (TLS Título Múltiple de estado de extensión).

SSLStaplingCache

Configura la memoria caché que se utiliza para almacenar las respuestas OCSP, que sean incluidos en el acuerdo de TLS si está habilitada la SSLUseStapling. La configuración de una memoria caché es obligatorio para el grapado OCSP. Con la excepción de none y nonenotnull, los mismos tipos de almacenamiento que son compatibles con SSLSessionCache.

La parte shmbc:

Esto hace uso de un búfer de circulación de alto rendimiento (aprox. size bytes de tamaño) dentro de un segmento de memoria compartida en la memoria RAM (establecido a través de /ruta/a/archivo de datos) para sincronizar los cachés de memoria OpenSSL locales de los procesos del servidor. Esta es la caché de sesión recomendada. Para utilizarl, asegúrate de que mod_socache_shmcb está cargado.

También puedes dar algunas opciones más. Por ejemplo, un tiempo de espera de la frescura, la edad de la respuesta OCSP puede ser:

SSLStaplingResponseMaxAge 900

De este modo, la respuesta sólo tendrá un máximo 15 minutos de antiguedad (900 segundos).

Si el servidor Apache está detrás de un proxy HTTP y necesita para hacer sus consultas OCSP través de un proxy puedes utilizar SSLStaplingForceURL. Esto anula la URL proporcionada por el certificado:

SSLStaplingForceURL http://internal-proxy.example.org

Reiniciar el Apache para cargar la nueva configuración:

# systemctl restart httpd.service

Y debería funcionar. Vamos a probarlo.

Prueba

Para ello, arranca un terminal y utiliza el siguiente comando OpenSSL para conectarte a tu sitio web:

# openssl s_client -connect example.org:443 -tls1 -tlsextdebug -status

En la respuesta, busca lo siguiente:

OCSP response:
======================================
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
Version: 1 (0x0)
Responder Id: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
Produced At: Jun 25 23:40:00 2016 GMT
Responses:
Certificate ID:
Hash Algorithm: sha1
Issuer Name Hash: 7EE66AE7729AB3FCF8A220646C16A12D6071085D
Issuer Key Hash: A84A6A63047DDDBAE6D139B7A64565EFF3A8ECA1
Serial Number: 033E35AA1CAD21E90BC1EBC1AC1385E2CF09
Cert Status: good
This Update: Jun 25 23:00:00 2016 GMT
Next Update: Jul 2 23:00:00 2016 GMT

Eso significa que está trabajando. Si se obtiene una respuesta como la de abajo, no está funcionando:

OCSP response: no response sent

También puedes utilizar la prueba de SSL Labs para ver si funciona el grapado de OCSP.

Jesus_Caceres