Tengo un certificado SSL comodín y varios subdominios en la misma ip. Ahora quiero que mi nginx maneje solo los nombres de servidor mencionados y desconecte la conexión para otros para que parezca que nginx
no se está ejecutando para nombres de servidor no listados (no responde, rechaza, muere, ni un solo byte en respuesta). Hago lo siguiente
ssl_certificate tls/domain.crt;
ssl_certificate_key tls/domain.key;
server {
listen 1.2.3.4:443 ssl;
server_name validname.domain.com;
//
}
server {
listen 1.2.3.4:443 ssl;
server_name _;
// deny all;
// return 444;
// return 404;
//location {
// deny all;
//}
}
He intentado casi todo en el último bloque del servidor, pero no he tenido éxito. Recibo una respuesta válida de un servidor virtual conocido o un código de error. Por favor ayuda.
fuente
La respuesta de cjc ya señaló correctamente el problema al intentar hacer coincidir los nombres de host cuando SSL está habilitado. Sin embargo, es posible hacerlo así:
Nota: sí, es cierto que generalmente
if
es malo , pero es seguro usarloif
en este caso. (Lea la página vinculada si necesita convencerse).Contrariamente a lo sugerido, simplemente agregar el siguiente bloque no funcionará:
porque un certificado SSL que coincida
validname.domain.com
no coincidirá con algún nombre de dominio aleatorio. Lo probé y nginx actuó como si el bloque no estuviera presente en absoluto.Esto tampoco funcionará:
porque hará que todas las conexiones HTTPS en el puerto 443 fallen, incluso las que deberían pasar. He probado este también.
wget
informó un error de protocolo de enlace SSL.fuente
La mayoría de las respuestas aquí son sobre por qué no funciona, no cómo hacerlo funcionar.
A continuación, se explica cómo: debe hacer que dicho servidor general sea un 'servidor_predeterminado' y debe proporcionar rutas a cert / key para que pueda descifrar la solicitud SSL entrante y que coincida con el encabezado Host:
Tenga en cuenta el ssl_certificate / ssl_certificate_key allí. Si no se especifican, nginx aún intenta utilizar dicho servidor predeterminado y falla, ya que no puede aceptar la conexión SSL sin un certificado / clave. Se puede usar cualquier certificado / clave, por ejemplo, autofirmado. ...
Para generar un certificado autofirmado:
Consulte también /server//a/841643/87439
fuente
Implementé la solución anterior hoy, y funcionó a la perfección. Todas las URL no especificadas se descartan, ahora. Colocar este código de servidor antes de que la entrada real del servidor virtual fuera clave: todas las URL mal formadas ahora van a este servidor 'predeterminado'.
fuente
Debería poder manejar esto haciendo que el servidor que maneja los elementos no listados sea el primer bloque de servidor en su configuración.
Todos los dominios no identificados específicamente serán manejados por este bloque de servidor.
fuente