Schreiben Sie einen Nginx-Serverblock zum Erfassen von Platzhalter-Subdomänen der Ebene N?

Schreiben Sie einen Nginx-Serverblock zum Erfassen von Platzhalter-Subdomänen der Ebene N?

Ich betreibe einen Nginx-Proxyserver, um SSL-Zertifikate automatisch mit OpenResty/Lua und LetsEncrypt innerhalb einer Multi-Tenant-SAAS-Plattform zu generieren. Ich habe viele Domänen, die Zertifikate benötigen, und kann sie nicht auf eine Whitelist setzen, daher akzeptiert mein Zertifikatsserver alle Anfragen, die darauf verweisen.

Ich sehe zunehmend, dass viele ungültige Domänenanfragen eingehen, die mit der folgenden Domänenstruktur übereinstimmen:

www.randomsubdomain.anydomain.com

Diese Domänennamenstruktur ist für meinen Dienst ungültig. Deshalb möchte ich in meiner Nginx-Konfiguration einen Serverblock erstellen, der diese Struktur abfängt und eine 444-Antwort zurückgibt, sodass von LE überhaupt kein Zertifikat angefordert wird.

Folgendes habe ich getestet:

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

Leider scheint dieser Block meine Testdomänen nicht zu erfassen, wenn ich die Konfiguration neu lade. Meine Testdomäne (www.randomsubdomain.anydomain.com) kommt durch und es wird ein Zertifikat ausgestellt, was ich nicht will. Liegt es an meinem regulären Ausdruck? Ich bin kein Experte für PCRE/nginx-reguläre Ausdrücke, daher wurde mein regulärer Ausdruck mit einem der verfügbaren Online-Tester erstellt.

Wenn ich den Servernamen jedoch in den tatsächlichen Domänennamen „www.test.customdomain.com“ ändere, erkennt der Serverblock dies und gibt die gewünschte 444-Antwort zurück.

Ich habe ziemlich viele Serverblöcke für meine App konfiguriert, um LetsEncrypt-Zertifikate ausstellen zu lassen. Wenn es also nicht mein regulärer Ausdruck ist, hat meiner Ansicht nach einer der anderen Vorrang, obwohl ich den obigen Block ganz oben habe.

Hier ist der vollständige Block zur Referenz, wobei app-server.com der Domänenname meines Dienstes ist. Vielen Dank im Voraus für alle Tipps/Anleitungen.

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

verwandte Informationen