¿Escribir un bloque de servidor nginx para capturar subdominios comodín de nivel N?

¿Escribir un bloque de servidor nginx para capturar subdominios comodín de nivel N?

Estoy ejecutando un servidor proxy Nginx para generar automáticamente certificados SSL usando OpenResty/Lua y LetsEncrypt, dentro de una plataforma SAAS multiinquilino. Tengo muchos dominios que necesitan certificados y no puedo incluirlos en la lista blanca, por lo que mi servidor de certificados acepta todas las solicitudes que apuntan a ellos.

Estoy empezando a ver muchas solicitudes de dominio no válidas que coinciden con la estructura de dominio de:

www.randomsubdomain.anydomain.com

Esa estructura de nombre de dominio no es válida para mi servicio, así que lo que me gustaría hacer es crear un bloque de servidor en mi configuración de nginx que detecte esta estructura y devuelva una respuesta 444, de modo que no se solicite ningún certificado a LE.

Esto es lo que he probado:

server {
  listen 80;
  server_name ~^www\.(.+)\.(.+)\.com$;
  return 444;
}

Desafortunadamente, este bloque no parece detectar mis dominios de prueba una vez que recargo la configuración. Mi dominio de prueba (www.randomsubdomain.anydomain.com) pasa y se emite un certificado, que no es lo que quiero. ¿Es mi expresión regular? Estoy lejos de ser un experto en expresiones regulares PCRE/nginx, por lo que mi expresión regular se construyó utilizando uno de los probadores en línea disponibles.

Pero si cambio el nombre del servidor a un nombre de dominio real de "www.test.customdomain.com", el bloque del servidor lo detecta y devuelve la respuesta 444 deseada.

Tengo bastantes bloques de servidor configurados para mi aplicación para poder emitir certificados LetsEncrypt, por lo que si no es mi expresión regular, creo que una de las otras tiene prioridad, aunque tengo el bloque anterior cerca de la parte superior.

Aquí está el bloque completo como referencia, donde app-server.com es el nombre de dominio de mi servicio. Gracias de antemano por cualquier consejo/orientación.

user ec2-user www;
events {
  worker_connections 1024;
}

http {
  lua_shared_dict auto_ssl 100m; #need 1MB per 100 domains in memory
  lua_shared_dict auto_ssl_settings 64k;
  resolver 8.8.8.8 ipv6=off;

  init_by_lua_block {
    auto_ssl = (require "resty.auto-ssl").new()
    auto_ssl:set("allow_domain", function(domain)
      return true
    end)

    auto_ssl:init()
  }

  init_worker_by_lua_block {
    auto_ssl:init_worker()
  }

  # Handles SSL app-server.com subdomain requests so they aren't redirected
  server {
    listen 443 ssl;
    server_name *.app-server.com;

    location / {
      proxy_pass http://ssl-sites.app-server.com;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header X-Forwarded-Ssl on;
    }
    ssl_certificate_by_lua_block {
      auto_ssl:ssl_certificate()
    }
    ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
    ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;

  }

  # Capture SSL requests that already have www and redirect to https://www
  server {
    listen 443 ssl;
    server_name www.*;

    location / {
      proxy_pass http://ssl-sites.app-server.com;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header X-Forwarded-Ssl on;
    }
    ssl_certificate_by_lua_block {
      auto_ssl:ssl_certificate()
    }
    ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
    ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;
  }

  # Capture SSL requests without www and redirect to https://www on subsequent requests once the cert is issued
  server {
    listen 443 ssl default_server;
    ssl_certificate_by_lua_block {
      auto_ssl:ssl_certificate()
    }
    ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
    ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;

    return 301 https://www.$host$request_uri;
  }

  # Capture invalid subdomains
  server {
    listen 80;
    server_name ~^www\.(.+)\.(.+)\.com$;
    return 444;
  }

  # Capture requests that already have www and redirect to https://www
  server {
    listen 80;
    server_name www.*;
    location / {
      return 301 https://$host$request_uri;
    }

    # send to challenge if looking for it
    location /.well-known/acme-challenge/ {
      content_by_lua_block {
        auto_ssl:challenge_server()
      }
    }
  }

# Captures the app-server.com subdomain requests and redirects them
  server {
    listen 80 ;
    server_name *.app-server.com;

    location / {
      return 301 https://$host$request_uri;
    }
    # send to challenge if looking for it
    location /.well-known/acme-challenge/ {
      content_by_lua_block {
        auto_ssl:challenge_server()
      }
    }
  }

  # Capture requests without www and redirect to https://www
  server {
    listen 80 default_server;
    location / {
      return 301 https://www.$host$request_uri;
    }

    # Endpoint used for Let's Encrypt domain validation
    location /.well-known/acme-challenge/ {
      content_by_lua_block {
        auto_ssl:challenge_server()
      }
    }
  }

  server {
    listen 127.0.0.1:8999;
    client_body_buffer_size 128k;
    client_max_body_size 128k;

    location / {
      content_by_lua_block {
        auto_ssl:hook_server()
      }
    }
  }
}

información relacionada