nginx HTTPS WWW-Umleitung zu Nicht-WWW

8

Mein SSL-Zertifikat ist für mydomain.com, daher versuche ich, alle www.mydomain.com ohne www umzuleiten. Nun, all diese Arbeiten:

http://www.mydomain.com
http://mydomain.com
https://mydomain.com

Aber https://www.mydomain.com gibt dem Browser die Warnung "Site nicht sicher" aus. Ich habe versucht, eine Weiterleitung wie die folgende einzurichten, aber bitte sagen Sie mir, wo mein Skript fehlerhaft ist.

     server {
        listen      80;
        server_name www.mydomain.com mydomain.com;
        rewrite     ^(.*)   https://mydomain.com$1 permanent;
        client_max_body_size 100M;
            location / {
                   index    index.htm index.html index.php;
            }

            location ~ \.php$ {
                    include fastcgi_params;
                    fastcgi_index index.php;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_param SCRIPT_FILENAME /var/www/mysite$fastcgi_script_name;
            }


    }



    server {
        listen               443;
        ssl                  on;
        ssl_certificate      /usr/local/nginx/conf/public.crt;
        ssl_certificate_key  /usr/local/nginx/conf/server.key;


        server_name www.mydomain.com;
        rewrite ^(.*) https://mydomain.com$1 permanent;

    }





    server {
        listen               443;
        ssl                  on;
        ssl_certificate      /usr/local/nginx/conf/public.crt;
        ssl_certificate_key  /usr/local/nginx/conf/server.key;
        client_max_body_size 100M;
        server_name mydomain.com;
        root /var/www/mysite;
        index index.php;

        location ~ \.php$ {
                    include fastcgi_params;
                    fastcgi_index index.php;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_param SCRIPT_FILENAME /var/www/mysite$fastcgi_script_name;
        }


    }
James Gu
quelle
2
Möchten Sie nicht lieber ~ 50 US-Dollar für ein SSL-Zertifikat ausgeben und die Benutzerfreundlichkeit Ihrer Website erheblich verbessern?
Joel E Salas

Antworten:

14

Ihr Konfigurationsskript ist nicht fehlerhaft.

Bei Ihrer aktuellen Konfiguration (vorausgesetzt, Sie haben ein Standard-SSL-Zertifikat für einen einzelnen Betreff installiert) ist dies keine Option .

Der Grund dafür ist die Funktionsweise von https-Verbindungen:

Wenn ein Client (der Browser) eine https-Anforderung an den Server (nginx) sendet, initiiert er eine SSL-Sitzung über einen SSL-Handshake. Wenn und nur wenn der Handshake erfolgreich ist und die Sitzung eingerichtet ist, sendet der Browser die eigentliche HTTP-Anforderung mit dem Hostnamen. Da SSL / TLS nicht nur eine Möglichkeit zur Verschlüsselung von Datenverbindungen darstellt, sondern auch eine Möglichkeit für den Server, sich beim Client zu authentifizieren. Im Rahmen des Authentifizierungsprozesses überprüft der Browser die Identität des Servers. Eine der Überprüfungen besteht darin, den Namen des Zertifikatssubjekts mit dem Hostnamen abzugleichen, von dem der Browser Inhalte anfordern möchte. Wenn diese Überprüfung fehlschlägt, gibt der Browser eine Warnung an den Benutzer aus.

Da der Validierungsprozess fehlschlägt, empfängt der Server niemals die HTTP-Anforderung für www.mydomain.com auf dem Listener von Port 443 und kann daher keine Umleitungsantwort an den Client / Browser senden.

Um die Umleitung von https://www.mydomain.com/ zu https://mydomain.com zu aktivieren , haben Sie einige Optionen, aber alles hängt davon ab: Sie benötigen für jeden Hostnamen ein Zertifikat mit einem Betreff.

  1. SAN-Zertifikat

    • Erhalten Sie ein UC / SAN-Zertifikat und lassen Sie www.mydomain.com als SAN (Alternativer Name des Betreffs) hinzufügen.
    • Die Betreffs stimmen jetzt mit den Anforderungen für mydomain.comund übereinwww.mydomain.com
  2. Mehrere IP-Adressen

    • Erhalten Sie eine andere IP-Adresse für Ihren Server.
    • Besorgen Sie sich ein SSL-Zertifikat mit dem Betreff www.mydomain.com
    • Konfigurieren Sie das www.mydomain.comhttps so server, dass es die neue IP-Adresse abhört (immer noch Port 443).
    • Konfigurieren Sie das www.mydomain.comhttps serverfür die Verwendung des neuen Zertifikats
    • Aktualisieren Sie den A-Eintrag für www.mydomain.com, um auf die neue IP-Adresse in Ihrer öffentlichen DNS-Zone zu verweisen
  3. TLS SNI

    • Erhalten Sie wie im obigen Beispiel ein SSL-Zertifikat mit dem Betreffnamen www.mydomain.com
    • Statt eine andere IP - Adresse zu verwenden, nutzen Sie den Server Name Indication TLS - Erweiterung.

Da SNI nur eine eingeschränkte Browserunterstützung bietet, würde ich Vorschlag 3 vermeiden. Lesen Sie die Nginx-Dokumentation zu SNI, wenn Sie möchten (unten auf der Seite).

UPDATE : Einige Zertifizierungsstellen bieten Einzelfachzertifikate mit einem kostenlosen zusätzlichen SAN für das www.Präfix an.

Mathias R. Jessen
quelle
6

Sie können die Warnungen "Site nicht sicher" nicht vermeiden, wenn Ihre Domains nicht übereinstimmen. Ihr Zertifikat muss für jede einzelne Domain gültig sein, die Sie über HTTPS bereitstellen möchten, einschließlich der Nur-Weiterleitungs-Domains.

Wenn das Zertifikat ungültig für „www.example.com“ ist, ist nur gültig für „example.com“, dann kann man nicht von umleiten https://www.example.com/ zu https://example.com/ ohne eine Sicherheitswarnung.

cnst
quelle
3

Sie könnten dies versuchen:

server {    
        listen 443;
        server_name  www.domain.com;
        return 301 https://domain.com$request_uri;
}

Andernfalls können Sie ein Platzhalterzertifikat erhalten, das alle Domänen der dritten Ebene abdeckt.

Tacotuesday
quelle