Stellen Sie sich vor: Ich hatte gerade ein SSL-Zertifikat auf meiner Website shadynagy.com installiert. Aus meiner Sicht sah alles großartig aus – das Zertifikat war gültig, von Sectigo ausgestellt und hatte noch reichlich Zeit bis zum Ablauf (265 Tage!). Aber als ich einen schnellen SSL-Test auf WhyNoPadlock.com durchführte, wurde ich mit einigen enttäuschenden roten Kreuzchen konfrontiert:
❌ Force HTTPS: Erzwingt nicht die Verwendung von SSL
❌ Invalid Intermediate: Fehlendes Zwischenzertifikat (Bundle)
Mir sank das Herz. Was nützt ein SSL-Zertifikat, wenn es nicht richtig funktioniert? Meine Besucher könnten Sicherheitswarnungen sehen, Suchmaschinen könnten mich niedriger einstufen, und am schlimmsten – meine Website könnte unprofessionell wirken.
Aber hier ist die gute Nachricht: Ich habe alles behoben, und ich zeige Ihnen genau, wie ich es Schritt für Schritt gemacht habe.
Bevor wir uns in die Lösungen stürzen, sollten wir verstehen, was diese Fehler tatsächlich bedeuten:
Was ist ein Zwischenzertifikat?
Stellen Sie sich SSL-Zertifikate wie eine Vertrauenskette vor:
Ihre Website muss SOWOHL Ihr Zertifikat ALS AUCH das Zwischenzertifikat an Browser senden. Ohne das Zwischenzertifikat kann der Browser die Vertrauenskette nicht überprüfen.
Auswirkungen in der Praxis:
Was bedeutet das?
Wenn jemand http://shadynagy.com (ohne das ‘s’) eingibt, sollte er automatisch zu https://shadynagy.com weitergeleitet werden. Ohne diese Weiterleitung:
Ich stellte fest, dass meine nginx-Konfiguration die falsche Direktive verwendete. Das hatte ich:
# ❌ FALSCHE KONFIGURATIONssl_certificate /etc/nginx/ssl/shadynagy.com.crt;ssl_trusted_certificate /etc/nginx/ssl/shadynagy.com.ca-bundle;
Das Problem: ssl_trusted_certificate ist für OCSP-Stapling (eine Performance-Funktion) gedacht, NICHT zum Senden der Zertifikatskette an Browser!
Die Lösung besteht darin, ein Fullchain-Zertifikat zu erstellen, das Ihr Zertifikat mit dem Zwischenzertifikat kombiniert.
Befehl:
cat /etc/nginx/ssl/shadynagy.com.crt /etc/nginx/ssl/shadynagy.com.ca-bundle > /etc/nginx/ssl/shadynagy.com-fullchain.crt
Was dies bewirkt:
cat - Verkettet (kombiniert) Dateien> - Gibt in eine neue Datei namens “fullchain” ausBeispielerklärung: Stellen Sie sich vor, Sie haben zwei Puzzleteile:
Sie kleben sie zusammen, um ein vollständiges Puzzle zu erstellen, das Browser verstehen können.
Öffnen Sie Ihre SSL-Konfigurationsdatei:
nano /etc/nginx/conf.d/shadynagy.com-ssl.conf
Aktualisieren Sie auf Folgendes:
server {listen 443 ssl http2; # Port 443 mit SSL und HTTP/2# ✅ KORREKT - Verwenden Sie das Fullchain-Zertifikatssl_certificate /etc/nginx/ssl/shadynagy.com-fullchain.crt;ssl_certificate_key /etc/nginx/ssl/shadynagy.com.key;# Optional: Für OCSP-Stapling behalten (Performance-Boost)ssl_trusted_certificate /etc/nginx/ssl/shadynagy.com.ca-bundle;root /var/www/shady-nagy.com/html;index index.html index.htm;server_name shadynagy.com www.shadynagy.com;access_log /var/log/nginx/nginx.vhost.access.log;error_log /var/log/nginx/nginx.vhost.error.log;location / {try_files $uri $uri/ =404;}}
Wichtige Änderungen erklärt:
listen 443 ssl http2;
443 = HTTPS-Portssl = SSL aktivierenhttp2 = HTTP/2 für bessere Performance aktivierenssl on;ssl_certificate verweist jetzt auf Fullchain statt nur auf Ihr Zertifikat
ssl_trusted_certificate wird für OCSP-Stapling beibehalten (optional, aber empfohlen)
Konfiguration testen:
nginx -t
Erwartete Ausgabe:
nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful
Wenn Sie Fehler sehen, überprüfen Sie Ihre Dateipfade und Syntax doppelt!
Änderungen anwenden:
systemctl reload nginx
Warum reload statt restart?
reload wendet Änderungen an, ohne Verbindungen zu unterbrechenrestart würde Ihre Website kurzzeitig offline nehmenZuerst überprüfte ich meine HTTP-Konfiguration:
cat /etc/nginx/conf.d/shadynagy.com.conf
Ich fand Folgendes:
# ❌ DEFEKTE KONFIGURATIONserver {listen 80;root /var/www/shady-nagy.com/html;server_name shadynagy.com www.shadynagy.com;location / {try_files $uri $uri/ =404;}return 301 https://$server_name$request_uri; # Wird nie erreicht!}
Das Problem: Nginx liest Konfigurationen von oben nach unten. Wenn eine Anfrage einging:
location /-Block gefundenEs ist, als würde man ein Umleitungsschild NACH der Straße aufstellen!
Die Lösung:
# ✅ KORREKTE KONFIGURATIONserver {listen 80;listen [::]:80; # Auch auf IPv6 lauschenserver_name shadynagy.com www.shadynagy.com;# ALLEN HTTP-Traffic zu HTTPS weiterleitenreturn 301 https://$host$request_uri;}
Was jeder Teil bewirkt:
listen 80; - Auf HTTP-Anfragen lauschen (Port 80)listen [::]:80; - Auch auf IPv6-HTTP-Anfragen lauschenserver_name - Für welche Domains dies giltreturn 301 - Eine permanente Weiterleitung senden (Statuscode 301)$host - Die Domain, die der Benutzer eingegeben hat (behält www vs. nicht-www bei)$request_uri - Der angeforderte Pfad (z. B. /about oder /contact)Beispiel in Aktion:
Wenn jemand besucht: http://www.shadynagy.com/how-i-fixed-ssl-certificate-issues-on-my-website-a-complete-guide
Wird weitergeleitet zu: https://www.shadynagy.com/how-i-fixed-ssl-certificate-issues-on-my-website-a-complete-guide
Konfiguration testen:
nginx -t
Nginx neu laden:
systemctl reload nginx
Weiterleitung testen:
curl -I http://shadynagy.com
Erwartete Ausgabe:
HTTP/1.1 301 Moved PermanentlyLocation: https://shadynagy.com/
Perfekt! Aber warten Sie mal…
Als ich in meinem Browser testete, funktionierte es immer noch nicht! Nach einigen Untersuchungen:
firewall-cmd --list-all
Ausgabe:
services: https
Fällt Ihnen auf, was fehlt? HTTP (Port 80)!
Die Weiterleitung war perfekt konfiguriert, aber meine Firewall blockierte eingehenden HTTP-Traffic. Es ist, als würde man eine Haustür einbauen, aber eine Mauer davor errichten!
HTTP-Dienst hinzufügen:
firewall-cmd --permanent --add-service=http
Firewall neu laden:
firewall-cmd --reload
Überprüfen, ob es funktioniert hat:
firewall-cmd --list-all
Jetzt sollten Sie sehen:
services: http https
Hier sind alle Befehle, die ich während der Fehlerbehebung verwendet habe:
# Alle Serverblöcke finden, die auf Port 80 lauschengrep -r "listen 80" /etc/nginx/# Nginx-Konfigurationssyntax testennginx -t# Vollständige Nginx-Konfiguration anzeigennginx -T# Bestimmten Serverblock anzeigennginx -T 2>/dev/null | grep -A 15 "server_name shadynagy.com"
# Läuft nginx?systemctl status nginx# Nginx neu laden (Änderungen ohne Ausfallzeit anwenden)systemctl reload nginx# Nginx neu starten (kurze Ausfallzeit)systemctl restart nginx# Fehlerprotokolle überprüfentail -20 /var/log/nginx/error.log
# Weiterleitung testen (umgeht Browser-Cache)curl -I http://shadynagy.com# Allen Weiterleitungen folgencurl -IL http://shadynagy.com
# Lauscht nginx auf Port 80?ss -tlnp | grep :80# Lauscht nginx auf Port 443?ss -tlnp | grep :443
# Alle Firewall-Regeln auflistenfirewall-cmd --list-all# HTTP permanent hinzufügenfirewall-cmd --permanent --add-service=http# HTTPS permanent hinzufügenfirewall-cmd --permanent --add-service=https# Änderungen anwendenfirewall-cmd --reload
Datei: /etc/nginx/conf.d/shadynagy.com.conf
server {listen 80;listen [::]:80;server_name shadynagy.com www.shadynagy.com;return 301 https://$host$request_uri;}
Datei: /etc/nginx/conf.d/shadynagy.com-ssl.conf
server {listen 443 ssl http2;ssl_certificate /etc/nginx/ssl/shadynagy.com-fullchain.crt;ssl_certificate_key /etc/nginx/ssl/shadynagy.com.key;ssl_trusted_certificate /etc/nginx/ssl/shadynagy.com.ca-bundle;root /var/www/shady-nagy.com/html;index index.html index.htm index.nginx-debian.html;server_name shadynagy.com www.shadynagy.com;access_log /var/log/nginx/nginx.vhost.access.log;error_log /var/log/nginx/nginx.vhost.error.log;location / {add_header Cache-Control "no-cache, no-store, must-revalidate";add_header Pragma "no-cache";add_header Expires 0;try_files $uri $uri/ =404;}}
Nach Implementierung aller Korrekturen zeigte mein SSL-Test auf WhyNoPadlock.com:
✅ SSL Connection - Bestanden
✅ Valid Certificate - SSL-Zertifikat ist korrekt installiert
✅ Force HTTPS - Webserver erzwingt die Verwendung von SSL
✅ Domain Matching - Zertifikat stimmt mit Domainnamen überein
✅ Signature - Verwendet sha256WithRSAEncryption
✅ Expiration Date - Zertifikat ist aktuell (läuft ab am 2026-11-03)
✅ Mixed Content - Kein gemischter Inhalt
Perfekte Punktzahl!
A: Das Zwischenzertifikat erstellt eine Vertrauenskette von Ihrer Website zu einer vertrauenswürdigen Root-Autorität. Ohne es:
Stellen Sie es sich so vor: Wenn sich jemand als “John, Freund von Sarah” vorstellt, vertrauen Sie ihm vielleicht nicht. Aber wenn Sarah Ihre beste Freundin ist und sie für John bürgt, vertrauen Sie ihm. Das Zwischenzertifikat ist Sarah, die für das Zertifikat Ihrer Website bürgt.
ssl_certificate und ssl_trusted_certificate in nginx?A: Großartige Frage!
ssl_certificate: Dies sendet nginx an Browser, um die Identität Ihrer Website zu beweisen. Es sollte Ihr Zertifikat UND das Zwischenzertifikat (Fullchain) enthalten.
ssl_trusted_certificate: Dies wird für OCSP-Stapling verwendet, eine Performance-Funktion. Nginx verwendet dies, um den Zertifikatssperrstatus im Namen von Clients zu überprüfen. Es wird nicht an Browser gesendet.
Analogie:
ssl_certificate = Ihr Ausweis, den Sie Leuten zeigenssl_trusted_certificate = Ihre persönliche Kopie der Regeln, auf die Sie für sich selbst Bezug nehmen$host statt $server_name in Weiterleitungen verwenden?A:
$host: Die exakte Domain, die der Benutzer in seinem Browser eingegeben hat (z. B. www.shadynagy.com oder shadynagy.com)$server_name: Der erste server_name in Ihrer KonfigurationBeispielszenario:
server_name shadynagy.com www.shadynagy.com;http://www.shadynagy.comMit $server_name: Leitet zu https://shadynagy.com weiter (entfernt das www)
Mit $host: Leitet zu https://www.shadynagy.com weiter (behält das www bei)
Die Verwendung von $host respektiert, was der Benutzer eingegeben hat, und verhindert unnötige zusätzliche Weiterleitungen.
A: Dies ist normalerweise eines von drei Problemen:
Firewall blockiert Port 80 (mein Problem!) - Die Weiterleitungskonfiguration war korrekt, aber eingehender HTTP-Traffic erreichte nginx nie.
Browser-Cache - Browser cachen Weiterleitungen aggressiv. Lösung: Im Inkognito-Modus testen oder Cache leeren.
DNS-Cache - Ihr Computer hat möglicherweise alte DNS-Einträge. Lösung: DNS-Cache leeren oder einige Stunden warten.
Profi-Tipp: Testen Sie immer zuerst mit curl -I, da es alle Caches umgeht!
return oder rewrite für HTTPS-Weiterleitungen verwenden?A: Verwenden Sie immer return für Weiterleitungen!
return (empfohlen):
return 301 https://$host$request_uri;
rewrite (für einfache Weiterleitungen vermeiden):
rewrite ^ https://$host$request_uri permanent;
Faustregel: Verwenden Sie return für Weiterleitungen, verwenden Sie rewrite nur, wenn Sie die URL-Struktur ändern müssen.
reload und restart für nginx?A:
systemctl reload nginx (empfohlen):
systemctl restart nginx (sparsam verwenden):
Wann restart statt reload:
A: Führen Sie diese Diagnosebefehle aus:
# Überprüfen, ob nginx auf Port 80 lauschtss -tlnp | grep :80# Wenn Sie nginx hier sehen, lauscht es# Firewall-Regeln überprüfenfirewall-cmd --list-all# Suchen Sie nach 'http' in der Dienstliste# Von außerhalb Ihres Servers testencurl -I http://your-domain.com# Wenn es zeitüberschreitet, blockiert möglicherweise die Firewall
Wenn nginx lauscht, ABER curl von außen zeitüberschreitet → Firewall ist das Problem!
A: Gemischter Inhalt tritt auf, wenn Ihre HTTPS-Seite Ressourcen (Bilder, Skripte, CSS) über HTTP lädt.
Beispielproblem:
<!-- ❌ SCHLECHT - Bild über HTTP auf HTTPS-Seite laden --><img src="http://shadynagy.com/image.jpg">
Lösungen:
<!-- ✅ GUT - HTTPS verwenden --><img src="https://shadynagy.com/image.jpg"><!-- ✅ GUT - Protokoll-relative URL verwenden --><img src="//shadynagy.com/image.jpg"><!-- ✅ AM BESTEN - Relative URL verwenden --><img src="/image.jpg">
Auf gemischten Inhalt prüfen:
A: Teilweise, ja.
Was Sie erneut tun müssen:
Was Sie NICHT erneut tun müssen:
Profi-Tipp: Automatisieren Sie die Zertifikatserneuerung mit Let’s Encrypt/Certbot, das die Fullchain automatisch handhabt!
A: Absolut! So geht’s:
1. Nginx-Konfigurationssyntax testen:
nginx -t
2. Lokal mit curl testen:
# Weiterleitung testencurl -I http://localhost# HTTPS testen (kann Zertifikatswarnung beim lokalen Testen erhalten)curl -Ik https://localhost
3. Online-Tools verwenden:
4. In Staging-Umgebung testen: Wenn möglich, richten Sie eine Test-Subdomain ein (wie staging.shadynagy.com) und testen Sie dort zuerst.
A: HTTP/2 ist eine neuere, schnellere Version des HTTP-Protokolls.
Vorteile:
Wie aktivieren:
listen 443 ssl http2; # Fügen Sie einfach 'http2' hier hinzu!
Anforderungen:
Überprüfung:
curl -I --http2 https://shadynagy.com# Suchen Sie nach "HTTP/2 200" in der Antwort
A: Wenn Sie --permanent nicht verwenden, verschwinden Ihre Firewall-Regeln beim Neustart des Servers!
Nicht permanent (geht beim Neustart verloren):
firewall-cmd --add-service=http # ❌ Nach Neustart weg
Permanent (überlebt Neustart):
firewall-cmd --permanent --add-service=http # ✅ Bleibt nach Neustartfirewall-cmd --reload # Sofort anwenden
Überprüfen, ob eine Regel permanent ist:
# Laufzeit-(aktuelle) Regeln anzeigenfirewall-cmd --list-all# Permanente (gespeicherte) Regeln anzeigenfirewall-cmd --permanent --list-all
Wenn sie nicht übereinstimmen, müssen Sie Ihre Änderungen permanent machen!
A: Hier ist ein guter Wartungsplan:
Monatlich:
Vor Ablauf:
Nach Server-Updates:
Überwachung einrichten: Viele Dienste bieten kostenloses SSL-Monitoring:
Sie mailen Ihnen, bevor Ihr Zertifikat abläuft!
A: Sie benötigen einen separaten Serverblock für jede Domain.
Beispiel für mehrere Domains:
# Domain 1: shadynagy.comserver {listen 80;server_name shadynagy.com www.shadynagy.com;return 301 https://$host$request_uri;}server {listen 443 ssl http2;server_name shadynagy.com www.shadynagy.com;ssl_certificate /etc/nginx/ssl/shadynagy.com-fullchain.crt;ssl_certificate_key /etc/nginx/ssl/shadynagy.com.key;root /var/www/shadynagy.com;}# Domain 2: myotherdomain.comserver {listen 80;server_name myotherdomain.com www.myotherdomain.com;return 301 https://$host$request_uri;}server {listen 443 ssl http2;server_name myotherdomain.com www.myotherdomain.com;ssl_certificate /etc/nginx/ssl/myotherdomain.com-fullchain.crt;ssl_certificate_key /etc/nginx/ssl/myotherdomain.com.key;root /var/www/myotherdomain.com;}
Alternative: Verwenden Sie ein Wildcard-Zertifikat oder Multi-Domain-Zertifikat (SAN), um mehrere Domains mit einem Zertifikat abzudecken.
A: Überprüfen Sie diese häufigen Probleme:
Zertifikatsname stimmt nicht überein:
www.shadynagy.com, aber Sie besuchen shadynagy.comAbgelaufenes Zertifikat:
openssl x509 -in certificate.crt -noout -datesGemischter Inhalt:
Falsche Domain in nginx-Konfiguration:
server_name stimmt nicht mit der Domain überein, die Sie besuchenserver_name hinzufügenZertifikat nicht vertrauenswürdig:
Schnelldiagnose:
# Überprüfen, welches Zertifikat bereitgestellt wirdopenssl s_client -connect shadynagy.com:443 -servername shadynagy.com
🔗 SSL Labs - Umfassendster SSL-Test, gibt Ihnen eine A-F-Bewertung
🔗 WhyNoPadlock - Schnelle visuelle Überprüfung auf häufige SSL-Probleme
🔗 SSL Shopper - Überprüft Zertifikatsinstallation und -kette
🔗 Security Headers - Testet HTTP-Sicherheitsheader
🔗 High-Tech Bridge - Detaillierte SSL/TLS- und Sicherheitsbewertung
✅ Immer ein Fullchain-Zertifikat erstellen (Zertifikat + CA-Bundle)
✅ ssl_certificate-Direktive für die Fullchain verwenden
✅ ssl_trusted_certificate nur für OCSP-Stapling verwenden
✅ Mit Online-Tools nach Installation testen
✅ return 301 für Weiterleitungen verwenden (nicht rewrite)
✅ Weiterleitung VOR location-Blöcken platzieren
✅ $host verwenden, um Domänen-Eingabe des Benutzers beizubehalten
✅ Daran denken, Port 80 in der Firewall zu öffnen!
✅ Nginx-Konfiguration immer mit nginx -t vor dem Neuladen testen
✅ curl verwenden, um Browser-Cache zu umgehen
✅ Firewall-Regeln mit firewall-cmd --list-all überprüfen
✅ Port-Lauschen mit ss -tlnp überprüfen
✅ Ablaufbenachrichtigungen für Zertifikate einrichten
✅ Firewall-Regeln permanent machen
✅ Nginx und OpenSSL aktuell halten
✅ SSL-Konfiguration regelmäßig testen
Die SSL-Konfiguration mag zunächst entmutigend erscheinen, aber sobald Sie die Komponenten verstehen, ist sie ziemlich logisch:
Die Aufschlüsselung des Problems in diese Komponenten machte es viel einfacher zu diagnostizieren und zu beheben.
Die wichtigste Lektion? Wenn etwas nicht funktioniert, Schicht für Schicht überprüfen:
nginx -t)ss -tlnp)firewall-cmd --list-all)curl -I http://localhost)Dieser systematische Ansatz ersparte mir stundenlange Frustration!
Wir würden uns über Ihr Feedback zu diesem Tutorial freuen! Wenn Sie Fragen oder Verbesserungsvorschläge haben, zögern Sie bitte nicht, uns zu kontaktieren. Sie können unten einen Kommentar hinterlassen oder uns über die folgenden Kanäle kontaktieren:
War dies hilfreich? Teilen Sie es mit jemandem, der mit SSL-Konfiguration kämpft!
Quick Links
Legal Stuff
