SSL#

Proporciona el soporte necesario para que un servidor proxy de stream funcione con el protocolo SSL/TLS.

Cuando se compila a partir del código fuente, este módulo no se incluye de forma predeterminada; debe habilitarse con la opción de compilación --with-stream_ssl_module.

En los paquetes e imágenes de nuestros repositorios, el módulo está incluido en la compilación.

Nota

Este módulo requiere la biblioteca OpenSSL.

Ejemplo de configuración#

Para reducir la carga del procesador, se recomienda:

worker_processes auto;

stream {

    #...

    server {
        listen              12345 ssl;

        ssl_protocols       TLSv1.2 TLSv1.3;
        ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
        ssl_certificate     /usr/local/angie/conf/cert.pem;
        ssl_certificate_key /usr/local/angie/conf/cert.key;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;

    #    ...
    }

Directivas#

ssl_alpn#

Sintaxis

ssl_alpn protocolo ...;

Predeterminado

Contexto

stream, server

Especifica la lista de protocolos ALPN admitidos. Uno de los protocolos debe ser negociado si el cliente utiliza ALPN:

map $ssl_alpn_protocol $proxy {
    h2                 127.0.0.1:8001;
    http/1.1           127.0.0.1:8002;
}

server {
    listen      12346;
    proxy_pass  $proxy;
    ssl_alpn    h2 http/1.1;
}

ssl_certificate#

Sintaxis

ssl_certificate archivo;

Predeterminado

Contexto

stream, server

Especifica un archivo con el certificado en formato PEM para el servidor dado. Si se deben especificar certificados intermedios además del certificado principal, deben incluirse en el mismo archivo en el siguiente orden: primero el certificado principal y luego los certificados intermedios. Una clave secreta en formato PEM también puede colocarse en el mismo archivo.

Esta directiva puede especificarse varias veces para cargar certificados de distintos tipos, por ejemplo, RSA y ECDSA:

server {
    listen              12345 ssl;

    ssl_certificate     example.com.rsa.crt;
    ssl_certificate_key example.com.rsa.key;

    ssl_certificate     example.com.ecdsa.crt;
    ssl_certificate_key example.com.ecdsa.key;

#    ...
}

Solo OpenSSL 1.0.2 o superior admite cadenas de certificados separadas para diferentes certificados. Con versiones anteriores, solo se puede usar una cadena de certificados.

Nota

Se pueden usar variables en el nombre del archivo al utilizar OpenSSL 1.0.2 o superior:

ssl_certificate     $ssl_server_name.crt;
ssl_certificate_key $ssl_server_name.key;

Tenga en cuenta que el uso de variables implica que se cargará un certificado para cada handshake SSL, lo que puede tener un impacto negativo en el rendimiento.

En lugar de archivo, se puede especificar el valor data:`$variable`, que carga un certificado desde una variable sin utilizar archivos intermedios.

Tenga en cuenta que el uso inapropiado de esta sintaxis puede tener implicaciones de seguridad, como escribir datos de claves secretas en el registro de errores.

ssl_certificate_key#

Sintaxis

ssl_certificate_key archivo;

Predeterminado

Contexto

stream, server

Especifica un archivo con la clave secreta en formato PEM para el servidor dado.

Nota

Se pueden usar variables en el nombre del archivo al utilizar OpenSSL 1.0.2 o superior.

En lugar de archivo, se puede especificar el valor engine:`nombre`:id, que carga una clave secreta con un id determinado desde el motor OpenSSL nombre.

También se puede especificar el valor data:`$variable` en lugar de archivo, que carga una clave secreta desde una variable sin usar archivos intermedios. Tenga en cuenta que el uso inapropiado de esta sintaxis puede tener implicaciones de seguridad, como escribir datos de claves secretas en el registro de errores.

ssl_ciphers#

Sintaxis

ssl_ciphers cifrados;

Predeterminado

ssl_ciphers HIGH:!aNULL:!MD5;

Contexto

stream, server

Especifica los cifrados habilitados. Los cifrados se indican en el formato que entiende la biblioteca OpenSSL, por ejemplo:

ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

La lista de cifrados depende de la versión de OpenSSL instalada. La lista completa puede consultarse con el comando openssl ciphers.

Advertencia

La directiva ssl_ciphers no configura los cifrados para TLS 1.3 al usar OpenSSL. Para ajustar los cifrados TLS 1.3 con OpenSSL, utilice la directiva ssl_conf_command, añadida para configuración SSL avanzada.

  • En LibreSSL, los cifrados TLS 1.3 pueden configurarse usando ssl_ciphers.

  • En BoringSSL, los cifrados TLS 1.3 no pueden configurarse en absoluto.

ssl_client_certificate#

Sintaxis

ssl_client_certificate archivo;

Predeterminado

Contexto

stream, server

Especifica un archivo con certificados de CA confiables en formato PEM usados para verificar los certificados de cliente y respuestas OCSP si se habilita ssl_stapling.

La lista de certificados se enviará a los clientes. Si esto no es deseado, se puede usar la directiva ssl_trusted_certificate.

ssl_conf_command#

Sintaxis

ssl_conf_command nombre valor;

Predeterminado

Contexto

stream, server

Establece comandos arbitrarios de configuración de OpenSSL.

Nota

La directiva es compatible al usar OpenSSL 1.0.2 o superior. Para configurar cifrados TLS 1.3 con OpenSSL, use el comando ciphersuites.

Se pueden especificar varias directivas ssl_conf_command en el mismo nivel:

ssl_conf_command Options PrioritizeChaCha;
ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256;

Estas directivas se heredan del nivel de configuración anterior únicamente si no se definen directivas ssl_conf_command en el nivel actual.

Advertencia

Configurar OpenSSL directamente puede resultar en un comportamiento inesperado.

ssl_crl#

Sintaxis

ssl_crl archivo;

Predeterminado

Contexto

stream, server

Especifica un archivo con certificados revocados (CRL) en formato PEM usados para verificar los certificados de cliente.

ssl_dhparam#

Sintaxis

ssl_dhparam archivo;

Predeterminado

Contexto

stream, server

Especifica un archivo con parámetros DH para los cifrados DHE.

Advertencia

Por defecto no se establecen parámetros, y por lo tanto no se usarán cifrados DHE.

ssl_early_data#

Sintaxis

ssl_early_data on | off;

Predeterminado

ssl_early_data off;

Contexto

stream, server

Habilita o deshabilita los early data de TLS 1.3.

Nota

La directiva es compatible al usar OpenSSL 1.1.1 o superior, o BoringSSL.

ssl_ecdh_curve#

Sintaxis

ssl_ecdh_curve curva;

Predeterminado

ssl_ecdh_curve auto;

Contexto

stream, server

Especifica una curva para los cifrados ECDHE.

Nota

Al usar OpenSSL 1.0.2 o superior es posible especificar varias curvas, por ejemplo:

ssl_ecdh_curve prime256v1:secp384r1;

El valor especial auto indica a Angie que use la lista integrada en la biblioteca OpenSSL (si se usa OpenSSL 1.0.2 o superior) o prime256v1 con versiones anteriores.

Nota

Con OpenSSL 1.0.2 o superior, esta directiva establece la lista de curvas admitidas por el servidor. Por lo tanto, para que los certificados ECDSA funcionen, es importante incluir las curvas usadas en los certificados.

ssl_handshake_timeout#

Sintaxis

ssl_handshake_timeout tiempo;

Predeterminado

ssl_handshake_timeout 60s;

Contexto

stream, server

Especifica un tiempo de espera para completar el handshake SSL.

ssl_ocsp#

Sintaxis

ssl_ocsp on | off | leaf;

Predeterminado

ssl_ocsp off;

Contexto

stream, server

Habilita la validación OCSP de la cadena de certificados del cliente. El parámetro leaf habilita la validación únicamente del certificado del cliente.

Para que la validación OCSP funcione, la directiva ssl_verify_client debe estar establecida en on u optional.

Para resolver el nombre de host del respondedor OCSP, también debe especificarse la directiva resolver.

Ejemplo:

ssl_verify_client on;
ssl_ocsp          on;
resolver          127.0.0.53;

ssl_ocsp_cache#

Sintaxis

ssl_ocsp_cache off | [shared:nombre:tamaño];

Predeterminado

ssl_ocsp_cache off;

Contexto

stream, server

Establece el nombre y tamaño de la caché que almacena el estado de los certificados de cliente para la validación OCSP. La caché se comparte entre todos los procesos worker. Una caché con el mismo nombre puede usarse en varios servidores virtuales.

El parámetro off prohíbe el uso de la caché.

ssl_ocsp_responder#

Sintaxis

ssl_ocsp_responder uri;

Predeterminado

Contexto

stream, server

Sobrescribe la URI del respondedor OCSP especificado en la extensión del certificado "Authority Information Access" para la validación de certificados de cliente.

Solo se admiten respondedores OCSP con http://:

ssl_ocsp_responder http://ocsp.example.com/;

ssl_ntls#

Added in version 1.2.0.

Sintaxis

ssl_ntls on | off;

Predeterminado

ssl_ntls off;

Contexto

stream, server

Habilita el soporte del lado del servidor para NTLS usando la biblioteca TongSuo.

listen ... ssl;
ssl_ntls  on;

Nota

Angie debe compilarse con la opción de compilación --with-ntls y enlazarse con una biblioteca SSL que tenga soporte NTLS

./configure --with-openssl=../Tongsuo-8.3.0 \
            --with-openssl-opt=enable-ntls  \
            --with-ntls

ssl_password_file#

Sintaxis

ssl_password_file archivo;

Predeterminado

Contexto

stream, server

Especifica un archivo con las contraseñas para las claves secretas, donde cada contraseña se indica en una línea separada. Las contraseñas se prueban en orden al cargar la clave.

Ejemplo:

stream {
    ssl_password_file /etc/keys/global.pass;
    ...

    server {
        listen 127.0.0.1:12345;
        ssl_certificate_key /etc/keys/first.key;
    }

    server {
        listen 127.0.0.1:12346;

        # también puede usarse un named pipe en lugar de un archivo
        ssl_password_file /etc/keys/fifo;
        ssl_certificate_key /etc/keys/second.key;
    }
}

ssl_prefer_server_ciphers#

Sintaxis

ssl_prefer_server_ciphers on | off;

Predeterminado

ssl_prefer_server_ciphers off;

Contexto

stream, server

Especifica que deben preferirse los cifrados del servidor sobre los del cliente cuando se usan los protocolos SSLv3 y TLS.

ssl_protocols#

Sintaxis

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];

Predeterminado

ssl_protocols TLSv1.2 TLSv1.3;

Contexto

stream, server

Distinto en la versión 1.2.0: Se añadió el parámetro TLSv1.3 al conjunto predeterminado.

Habilita los protocolos especificados.

Nota

Los parámetros TLSv1.1 y TLSv1.2 funcionan solo cuando se usa OpenSSL 1.0.1 o superior.

El parámetro TLSv1.3 funciona solo cuando se usa OpenSSL 1.1.1 o superior.

ssl_session_cache#

Sintaxis

ssl_session_cache off | none | [builtin[:tamaño]] [shared:nombre:tamaño];

Predeterminado

ssl_session_cache none;

Contexto

stream, server

Establece los tipos y tamaños de caché que almacenan los parámetros de sesión. Una caché puede ser de los siguientes tipos:

off

el uso de la caché de sesión está estrictamente prohibido: Angie indica explícitamente al cliente que las sesiones no pueden reutilizarse.

none

el uso de la caché de sesión está suavemente deshabilitado: Angie indica al cliente que las sesiones pueden reutilizarse, pero en realidad no guarda parámetros de sesión en la caché.

builtin

una caché integrada en OpenSSL; usada solo por un proceso worker. El tamaño de la caché se especifica en sesiones. Si no se indica, es igual a 20480 sesiones. El uso de la caché integrada puede causar fragmentación de memoria.

shared

una caché compartida entre todos los procesos worker. El tamaño de la caché se especifica en bytes; un megabyte puede almacenar unas 4000 sesiones. Cada caché compartida debe tener un nombre arbitrario. Una caché con el mismo nombre puede usarse en varios servidores. También se usa para generar, almacenar y rotar periódicamente las claves de tickets de sesión TLS, salvo que se configure explícitamente mediante la directiva ssl_session_ticket_key.

Ambos tipos de caché pueden usarse simultáneamente, por ejemplo:

ssl_session_cache builtin:1000 shared:SSL:10m;

pero usar solo la caché compartida sin la integrada debería ser más eficiente.

ssl_session_ticket_key#

Sintaxis

ssl_session_ticket_key archivo;

Predeterminado

Contexto

stream, server

Establece un archivo con la clave secreta usada para cifrar y descifrar tickets de sesión TLS. La directiva es necesaria si la misma clave debe compartirse entre varios servidores. De forma predeterminada, se usa una clave generada aleatoriamente.

Si se especifican varias claves, solo la primera se usa para cifrar los tickets de sesión TLS. Esto permite configurar la rotación de claves, por ejemplo:

ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;

El archivo debe contener 80 o 48 bytes de datos aleatorios y puede crearse con el siguiente comando:

openssl rand 80 > ticket.key

Dependiendo del tamaño del archivo, se usa AES256 (para claves de 80 bytes) o AES128 (para claves de 48 bytes) para el cifrado.

ssl_session_tickets#

Sintaxis

ssl_session_tickets on | off;

Predeterminado

ssl_session_tickets on;

Contexto

stream, server

Habilita o deshabilita la reanudación de sesión mediante TLS session tickets.

ssl_session_timeout#

Sintaxis

ssl_session_timeout tiempo;

Predeterminado

ssl_session_timeout 5m;

Contexto

stream, server

Especifica el tiempo durante el cual un cliente puede reutilizar los parámetros de sesión.

ssl_stapling#

Sintaxis

ssl_stapling on | off;

Predeterminado

ssl_stapling off;

Contexto

http, server

Habilita o deshabilita el stapling de respuestas OCSP por parte del servidor. Ejemplo:

ssl_stapling on;
resolver 127.0.0.53;

Para que el OCSP stapling funcione, debe conocerse el certificado del emisor del certificado del servidor. Si el archivo ssl_certificate no contiene certificados intermedios, el certificado del emisor debe estar presente en el archivo ssl_trusted_certificate.

Advertencia

Para resolver el nombre de host del respondedor OCSP, también debe especificarse la directiva resolver.

ssl_stapling_file#

Sintaxis

ssl_stapling_file archivo;

Predeterminado

Contexto

http, server

Cuando se establece, la respuesta OCSP stapled se tomará del archivo especificado en lugar de consultar al respondedor OCSP indicado en el certificado del servidor.

El archivo debe estar en formato DER tal como lo produce el comando openssl ocsp.

ssl_stapling_responder#

Sintaxis

ssl_stapling_responder uri;

Predeterminado

Contexto

http, server

Sobrescribe la URI del respondedor OCSP especificado en la extensión del certificado "Authority Information Access".

Solo se admiten respondedores OCSP con http://:

ssl_stapling_responder http://ocsp.example.com/;

ssl_stapling_verify#

Sintaxis

ssl_stapling_verify on | off;

Predeterminado

ssl_stapling_verify off;

Contexto

http, server

Habilita o deshabilita la verificación de respuestas OCSP por parte del servidor.

Para que la verificación funcione, el certificado del emisor del certificado del servidor, el certificado raíz y todos los certificados intermedios deben configurarse como de confianza mediante la directiva ssl_trusted_certificate.

ssl_trusted_certificate#

Sintaxis

ssl_trusted_certificate archivo;

Predeterminado

Contexto

stream, server

Especifica un archivo con certificados CA de confianza en formato PEM usados para verificar certificados de cliente.

A diferencia del conjunto de certificados definido con ssl_client_certificate, esta lista no se enviará a los clientes.

ssl_verify_client#

Sintaxis

ssl_verify_client on | off | optional | optional_no_ca;

Predeterminado

ssl_verify_client off;

Contexto

stream, server

Habilita la verificación de certificados de cliente. El resultado de la verificación se almacena en la variable $ssl_client_verify. Si ocurre un error durante la verificación del certificado de cliente o el cliente no presenta el certificado requerido, la conexión se cierra.

optional

solicita el certificado de cliente y lo verifica si está presente.

optional_no_ca

solicita el certificado de cliente pero no requiere que esté firmado por un certificado CA de confianza. Está pensado para casos en los que un servicio externo a Angie realiza la verificación real del certificado.

ssl_verify_depth#

Sintaxis

ssl_verify_depth número;

Predeterminado

ssl_verify_depth 1;

Contexto

stream, server

Define la profundidad de verificación en la cadena de certificados de cliente.

Variables integradas#

El módulo stream_ssl admite las siguientes variables:

$ssl_alpn_protocol#

devuelve el protocolo seleccionado por ALPN durante el handshake SSL, o una cadena vacía en caso contrario.

$ssl_cipher#

devuelve el nombre del cifrado usado en una conexión SSL establecida.

$ssl_ciphers#

devuelve la lista de cifrados admitidos por el cliente. Los conocidos se muestran por nombre, los desconocidos en hexadecimal, por ejemplo:

AES128-SHA:AES256-SHA:0x00ff

Nota

La variable está totalmente soportada solo al usar OpenSSL versión 1.0.2 o superior. Con versiones anteriores, la variable está disponible solo para sesiones nuevas y muestra únicamente los cifrados conocidos.

$ssl_client_cert#

devuelve el certificado de cliente en formato PEM para una conexión SSL establecida, con cada línea (excepto la primera) precedida por un carácter de tabulación.

$ssl_client_fingerprint#

devuelve la huella digital SHA1 del certificado de cliente para una conexión SSL establecida.

$ssl_client_i_dn#

devuelve la cadena issuer DN (emisor) del certificado de cliente para una conexión SSL establecida, según RFC 2253.

$ssl_client_raw_cert#

devuelve el certificado de cliente en formato PEM para una conexión SSL establecida.

$ssl_client_s_dn#

devuelve la cadena subject DN (sujeto) del certificado de cliente para una conexión SSL establecida, según RFC 2253.

$ssl_client_serial#

devuelve el número de serie del certificado de cliente para una conexión SSL establecida.

$ssl_client_v_end#

devuelve la fecha de expiración del certificado de cliente.

$ssl_client_v_remain#

devuelve el número de días restantes hasta que expire el certificado de cliente.

$ssl_client_v_start#

devuelve la fecha de inicio de validez del certificado de cliente.

$ssl_client_verify#

devuelve el resultado de la verificación del certificado de cliente: SUCCESS, FAILED:reason y NONE si no se presentó certificado.

$ssl_curve#

devuelve la curva negociada usada en el intercambio de claves durante el handshake SSL. Las curvas conocidas se muestran por nombre, las desconocidas en hexadecimal, por ejemplo:

prime256v1

Nota

La variable solo es compatible al usar OpenSSL versión 3.0 o superior. Con versiones anteriores, el valor de la variable será una cadena vacía.

$ssl_curves#

devuelve la lista de curvas admitidas por el cliente. Las curvas conocidas se muestran por nombre, las desconocidas en hexadecimal, por ejemplo:

0x001d:prime256v1:secp521r1:secp384r1

Nota

La variable es compatible únicamente al usar OpenSSL versión 1.0.2 o superior. Con versiones anteriores, el valor de la variable será una cadena vacía.

La variable está disponible solo para sesiones nuevas.

$ssl_early_data#

devuelve "1" si se usa early data de TLS 1.3 y el handshake no está completo; en caso contrario devuelve "".

$ssl_protocol#

devuelve el protocolo de una conexión SSL establecida.

$ssl_server_cert_type#

toma los valores RSA, DSA, ECDSA, ED448, ED25519, SM2, RSA-PSS o unknown según el tipo de certificado y clave del servidor.

$ssl_server_name#

devuelve el nombre de servidor solicitado mediante SNI.

$ssl_session_id#

devuelve el identificador de sesión de una conexión SSL establecida.

$ssl_session_reused#

devuelve r si una sesión SSL fue reutilizada, o "." en caso contrario.