malawi
Goto Top

NGINX - Subdomains mit Wildcard Zertifikat von Lets Encrypt

Hallo,

ich nutze einen NGINX-Reverse-Proxy auf einem Pi-Zero. Dieser hat lediglich folgende Server Direktive:

server {
        listen 80;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        server_name sub1.meine-domain.de;
        ssl_certificate /etc/letsencrypt/live/meine-domain.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/meine-domain.de/privkey.pem;

        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;


        location / {
                proxy_set_header Host $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 $scheme;

                proxy_pass https://192.168.0.50;
                proxy_read_timeout 90;
                proxy_redirect https://192.168.0.50 https://sub1.meine-domain.de;
        }
}

Soweit funktioniert das Ganze auch. Wenn ich https://sub1.meine-domains.de im Browser eingebe, dann erscheint die gewünschte Seite. Auch das Zertifikat wird ordnungsgemäß angezeigt mit *.meine-domain.de.

Leider wird aber auch jede andere Subdomain akzeptiert und auf gleiche Weise verarbeitet.

adsökfjaösdlfkj.meine-domain.de
beispiel.meine-domain.de

Völlig egal was, es wird immer die angegebene Seite (unter "proxy_pass") angezeigt.

Ich war der Meinung, dass der Server lediglich die angegebene Subdomain "sub1.meine-domain.de" verarbeitet.

Wie kann ich das implementieren, dass er lediglich diese eine Subdomain weiterleitet?

Ich nutze den freien DynDNS-Dienst ddnss.de. Dort kann ich lediglich anwählen, dass Wildcard genutzt werden soll, also alle Subdomains (oder ich habe eine andere Funktion noch nicht entdeckt).

Danke!

Content-Key: 580514

Url: https://administrator.de/contentid/580514

Printed on: April 25, 2024 at 04:04 o'clock

Member: NordicMike
Solution NordicMike Jun 19, 2020 at 18:17:15 (UTC)
Goto Top
Das Zertifikat ist egal, der Server dürfte gar nicht antworten. Hast Du noch mehr config Dateien? Dieser Bereich würde definitiv nur auf sub1 reagieren. Hast noch noch irgendwo eine Config mit *.meine-domain.de?
Member: Dani
Dani Jun 19, 2020 at 18:55:22 (UTC)
Goto Top
Moin,
vermutlich die Standardkonfiguration, die auf die Anfragen reagiert. face-smile


Gruß,
Dani
Member: malawi
malawi Jun 20, 2020 updated at 05:11:21 (UTC)
Goto Top
Hey ihr Beiden,

ja die Default-Config existiert noch, allerdings nur im /sites-available/

Im /sites-enable/ habe ich den Simlink gelöscht.


Ich habe jetzt mal die Default Config-Datei (welche ich in Default.original umbenannt habe, weil ich dachte, das würde schon helfen sie zu deaktivieren) komplett gelöscht.

Leider komme ich nach wie vor mit jeder beliebigen Subdomain auf meinen Server.
Member: Blubberstrahl
Solution Blubberstrahl Jun 20, 2020 updated at 09:04:28 (UTC)
Goto Top
Hallo,
den nginx hast du denke ich schon neu gestartet?
service nginx reload 

LG
Member: malawi
malawi Jun 20, 2020 at 09:12:05 (UTC)
Goto Top
Ja, allerdings über „systemctl restart nginx.service“

Habe auch den kompletten Pi mal durchgestartet
Member: Dani
Dani Jun 20, 2020 at 10:21:17 (UTC)
Goto Top
Moin,
schau mal in die Standardkonfiguratione wie nginx.conf und ähnliches. Ich meine es gibt dort noch eine Standardkonfiguration, welche mit dem Sites nichts direkt zu tun hat.


Gruß,
Dani
Member: malawi
malawi Jun 20, 2020 at 10:43:13 (UTC)
Goto Top
Hier der Inhalt meiner nginx.conf:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}


#mail {
#	# See sample authentication script at:
#	# http:{{comment_single_line_double_slash:0}}
# 
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";  
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";  
# 
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
# 
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}

In den beiden Includes ist lediglich meine eine Direktive hinterlegt.

Der Ordner /etc/nginx/conf.d/ ist leer.
Member: ziqz00ma
Solution ziqz00ma Jun 20, 2020 updated at 11:32:28 (UTC)
Goto Top
Zitat von @malawi:
Leider wird aber auch jede andere Subdomain akzeptiert und auf gleiche Weise verarbeitet. (...) Ich war der Meinung, dass der Server lediglich die angegebene Subdomain "sub1.meine-domain.de" verarbeitet.

Normalerweise, wenn du SNI mit mehreren Serverblocks verwendest, definierst du in einem der Blocks "default_server". Da deine Konfiguration nur einen einzigen (https-)Serverblock enthält, wird diese Konfiguration vermutlich implizit als default_server verwendet.

Was du machen könntest:
  • Leg einen zusätzlichen Serverblock an
  • Definiere diesen als default_server
  • Fange alle Anfragen, welche nicht an sub1.meine-domain.de gehen, mit deinem default_server auf

In meiner eigenen Konfiguration sieht das bspw. so aus:
server {
        listen       443 ssl default_server;
        server_name  example.com;
        include /etc/nginx/tls-setting-recycling.conf;
        location / {
                proxy_pass  http://127.0.0.1:8080;
        }
}

Was dabei etwas unschön ist: Da du nicht weißt, ob der Client auf eine Subdomain oder auf meine-domain.de zugreift, ist es schwierig ein passendes Zertifikat zu verwenden (Kann Let's Encrypt mittlerweile Wildcard-Zertifikate? Ich benutze immer nur explizite Hostnamen). Anderseits passiert das gleiche, wenn jemand auf sub2.meine-domain.de zugreift, du dafür aber kein gültiges Zertifikat verwendest -- im Prinzip bleibt sich's also gleich.

Bevor Fragen kommen: In meiner tls-setting-recycling.conf steht unter anderem:
(...)
ssl_certificate      /cryptdata/certificates/$server_name.certchain.pem;
ssl_certificate_key  /cryptdata/certificates/$server_name.key.pem;
(...)
Member: Dani
Solution Dani Jun 20, 2020 at 11:30:36 (UTC)
Goto Top
Member: malawi
malawi Jun 20, 2020 at 12:57:05 (UTC)
Goto Top
Ach Mensch, super! Habe es jetzt so gelöst, dass ich eine default.meine-domain.de.conf angelegt habe, mit diesem Inhalt:

server {
        listen 443 ssl;
        server_name *.meine-domain.de default_server;
        ssl_certificate /etc/letsencrypt/live/meine-domain.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/meine-domain.de/privkey.pem;
        
            location / {
                        root /var/www/html;
                        index index.html index.htm index.php index.py;
                     }
       }

Funktioniert jetzt nur noch mit sub1.meine-domain.de face-smile)

Vielen Dank für eure Zeit !
Member: NordicMike
NordicMike Jun 22, 2020 at 15:21:58 (UTC)
Goto Top
Hae? Verstehe ich nicht... Mit dem *.meine-domain.de müsste der jetzt erst recht auf alles hören.
Member: ziqz00ma
ziqz00ma Jun 22, 2020 at 15:41:50 (UTC)
Goto Top
Zitat von @NordicMike:

Hae? Verstehe ich nicht... Mit dem *.meine-domain.de müsste der jetzt erst recht auf alles hören.

In der Konfiguration von @malawi gibt es jetzt zwei Server-Blöcke:
  • einen spezifisch für sub1.meine-domain.de
  • einen Catch-all für alles andere
Member: malawi
malawi Jun 22, 2020 at 17:12:29 (UTC)
Goto Top
Also so wie ich das verstehe, arbeitet er erst (ich weiß allerdings nicht woher er weiß, dass er die sub1.meine-domain.de zuerst nehmen soll) die sub1.meine-domain.de ab und wenn das nicht zutrifft, dann geht er auf die *.meine-domain.de. Diese wiederrum lasse ich auf einem Webserver enden, der anzeigt, dass diese Seite "nicht existiert".
Member: NordicMike
NordicMike Jun 24, 2020 at 07:17:31 (UTC)
Goto Top
Klingt logisch. Zusammen mit dem zweite Block macht es Sinn. Das ist ein guter Grund, warum man immer eine komplette Beschreibung liefern sollte, und nicht nur Fragmente.