Написание серверного блока nginx для захвата поддоменов N-уровня с подстановочными знаками?

Написание серверного блока nginx для захвата поддоменов N-уровня с подстановочными знаками?

Я использую прокси-сервер Nginx для автоматической генерации SSL-сертификатов с использованием OpenResty/Lua и LetsEncrypt в многопользовательской платформе SAAS. У меня много доменов, которым нужны сертификаты, и я не могу добавить их в белый список, поэтому мой сервер сертификатов принимает все запросы, которые на него указывают.

Я начинаю видеть много недействительных запросов на домены, которые соответствуют доменной структуре:

www.randomsubdomain.anydomain.com

Эта структура доменного имени недопустима для моего сервиса, поэтому я хотел бы создать блок сервера в моей конфигурации nginx, который перехватывает эту структуру и возвращает ответ 444, чтобы сертификат вообще не запрашивался у LE.

Вот что я проверил:

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

К сожалению, этот блок, похоже, не ловит мои тестовые домены после перезагрузки конфигурации. Мой тестовый домен (www.randomsubdomain.anydomain.com) проходит, и выдается сертификат, а это не то, что мне нужно. Это мое регулярное выражение? Я далек от эксперта по регулярным выражениям PCRE/nginx, поэтому мое регулярное выражение было составлено с помощью одного из доступных онлайн-тестеров.

Но если я изменю server_name на фактическое доменное имя «www.test.customdomain.com», блок сервера перехватит его и вернет желаемый ответ 444.

У меня настроено довольно много server_blocks для моего приложения, чтобы выдавать сертификаты LetsEncrypt, так что если это не мое регулярное выражение, то я думаю, что одно из других имеет приоритет, даже несмотря на то, что у меня указанный выше блок находится в самом верху.

Вот полный блок для справки, где app-server.com — доменное имя моей службы. Заранее спасибо за любые советы/руководства.

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

Связанный контент