Escrevendo um bloco de servidor nginx para capturar subdomínios curinga de nível N?

Escrevendo um bloco de servidor nginx para capturar subdomínios curinga de nível N?

Estou executando um servidor proxy Nginx para gerar automaticamente certificados SSL usando OpenResty/Lua e LetsEncrypt, em uma plataforma SAAS multilocatário. Tenho muitos domínios que precisam de certificados e não consigo colocá-los na lista de permissões, portanto, meu servidor de certificados aceita todas as solicitações que apontam para ele.

Estou começando a ver muitas solicitações de domínio inválidas que correspondem à estrutura de domínio de:

www.randomsubdomain.anydomain.com

Essa estrutura de nome de domínio não é válida para o meu serviço, então o que eu gostaria de fazer é criar um bloco de servidor na minha configuração do nginx que capture essa estrutura e retorne uma resposta 444, para que um certificado não seja solicitado ao LE.

Aqui está o que testei:

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

Infelizmente, este bloco parece não capturar meus domínios de teste depois que recarrego a configuração. Meu domínio de teste (www.randomsubdomain.anydomain.com) passa e um certificado é emitido, o que não é o que eu quero. É meu regex? Estou longe de ser um especialista em regex PCRE/nginx, então meu regex foi construído usando um dos testadores online disponíveis.

Mas se eu alterar o nome_do_servidor para um nome de domínio real "www.test.customdomain.com", o bloco do servidor o captura e retorna a resposta 444 desejada.

Eu tenho alguns server_blocks configurados para meu aplicativo para obter certificados LetsEncrypt emitidos, então, se não for meu regex, acho que um dos outros está tendo precedência, embora eu tenha o bloco acima perto do topo.

Aqui está o bloco completo para referência, onde app-server.com é o nome de domínio do meu serviço. Agradecemos antecipadamente por qualquer dica/orientação.

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()
      }
    }
  }
}

informação relacionada