Haga que Nginx rechace nombres de servidor desconocidos a través de HTTPS

7

Tengo una instancia de Nginx que usa SNI para servir múltiples dominios HTTPS desde una sola IP.

El único problema con la configuración es que Nginx responde con el primer dominio (que actúa como predeterminado) cada vez que se solicita una URL para la IP desnuda del servidor, o un dominio listado en esa IP para el que no hay un bloque de servidor HTTPS correspondiente. En este caso, preferiría simplemente devolver un 403 Prohibido estándar: configuraría un bloque de servidor predeterminado para hacer esto, pero no puedo evitar las advertencias de desajuste de certificados del cliente.

(¿Cómo c | C) y configuro Nginx para rechazar solicitudes a dichos dominios desconocidos / indefinidos sin necesidad de especificar un certificado SSL en particular que moleste a los navegadores? (es decir, necesito que Nginx rechace la solicitud con un 403 antes de molestar al cliente con un certificado "incorrecto"; desde el punto de vista del cliente, esto debería ser idéntico al caso en el que no se define ningún bloque de servidor HTTPS).

Carlton Gibson
fuente

Respuestas:

7

Esta pregunta es bastante similar a la que respondí ayer: nginx y SNI: ¿es posible resolver automáticamente el certificado SSL por nombre de dominio?

No es posible rechazar la conexión antes de que el usuario vea un mensaje de certificado incorrecto en su navegador. Para cuando Nginx pueda devolver una respuesta HTTP 403, el protocolo de enlace SSL ha finalizado y para completar el protocolo de enlace, el navegador debe aceptar el certificado proporcionado. Solo puede rechazar la conexión después de que el usuario haya aceptado el certificado configurando un servidor predeterminado:

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

Sin embargo, los navegadores más recientes admiten la Indicación del nombre del servidor y si tiene un certificado configurado para cada vhost, es bastante improbable que un usuario normal vea ese mensaje.

Puede ser posible rechazar conexiones sin un nombre de host válido indicado por SSL con iptables, pero eso es probablemente bastante complicado y no se ajustaría a ningún estándar.

Información actualizada: es posible return 444cancelar la conexión tcp inmediatamente antes de que se muestre un error de certificado.

xblax
fuente
Usando SNI, teóricamente podrías abortar la conexión cuando no hay un certificado para el nombre de dominio dado, lo que sería aún mejor que mostrar un error de certificado. Sabes como hacer esto?
Yogu
Sí, descubrí que es posible return 444abortar la conexión tcp antes de que se muestre un error de cert.
xblax
@xblax ¿Podría decirnos también CÓMO devolver 444 antes de que se muestre un certificado? Idealmente, no desperdiciaría recursos en un apretón de manos para una solicitud a un nombre_servidor que no conozco. SNI debe revelar el nombre solicitado incluso antes de descifrar la solicitud.
Tormenta estática
0

Si sus dominios son subdominios del mismo maestro (* .example.com), puede usar un certificado comodín. De lo contrario, no creo que pueda proporcionar ningún certificado con el que el navegador esté contento.

Chris Nava
fuente
Hola Chris. Aprecio el punto comodín pero no es realmente lo que estoy preguntando. Sí, al navegador no le va a gustar ningún certificado PERO ¿hay alguna forma de rechazar la conexión basada en el nombre del servidor solicitado? (Sospecho que no, pero este parece ser el lugar para preguntar ... :)
Carlton Gibson
Supuesto no probado -> Deberá proporcionar un certificado válido o el navegador considerará que la conexión no es segura. Por lo tanto, el navegador no actuará en ninguna redirección que envíe hasta que el usuario permita una anulación. La única forma en que puedo pensar para realizar automáticamente la anulación es proporcionar un certificado válido. :-(
Chris Nava