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-ID: 580514

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

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

NordicMike
Lösung NordicMike 19.06.2020 um 20:17:15 Uhr
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?
Dani
Dani 19.06.2020 um 20:55:22 Uhr
Goto Top
Moin,
vermutlich die Standardkonfiguration, die auf die Anfragen reagiert. face-smile


Gruß,
Dani
malawi
malawi 20.06.2020 aktualisiert um 07:11:21 Uhr
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.
Blubberstrahl
Lösung Blubberstrahl 20.06.2020 aktualisiert um 11:04:28 Uhr
Goto Top
Hallo,
den nginx hast du denke ich schon neu gestartet?
service nginx reload 

LG
malawi
malawi 20.06.2020 um 11:12:05 Uhr
Goto Top
Ja, allerdings über „systemctl restart nginx.service“

Habe auch den kompletten Pi mal durchgestartet
Dani
Dani 20.06.2020 um 12:21:17 Uhr
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
malawi
malawi 20.06.2020 um 12:43:13 Uhr
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.
ziqz00ma
Lösung ziqz00ma 20.06.2020 aktualisiert um 13:32:28 Uhr
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;
(...)
Dani
Lösung Dani 20.06.2020 um 13:30:36 Uhr
Goto Top
malawi
malawi 20.06.2020 um 14:57:05 Uhr
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 !
NordicMike
NordicMike 22.06.2020 um 17:21:58 Uhr
Goto Top
Hae? Verstehe ich nicht... Mit dem *.meine-domain.de müsste der jetzt erst recht auf alles hören.
ziqz00ma
ziqz00ma 22.06.2020 um 17:41:50 Uhr
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
malawi
malawi 22.06.2020 um 19:12:29 Uhr
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".
NordicMike
NordicMike 24.06.2020 um 09:17:31 Uhr
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.