Wie Erstellen und Verwenden eines Selbst Signierten SSL in Nginx

0
242

Wenn Sie nur die Verschlüsselung für die interne server-verbindungen oder nicht-Benutzer vor Websites, die Unterzeichnung Ihre eigenen SSL-Zertifikate ist eine einfache Möglichkeit, zu vermeiden Umgang mit einer externen Zertifikat-Autorität. Hier ist, wie für die Einrichtung von nginx.

Wenn Sie sind mehr daran interessiert, Kostenlose SSL-Zertifikate, Sie können immer LetsEncrypt, das ist mehr geeignet für den öffentlichen Servern mit Benutzer-websites, da wird es zeigen sich, als komme Sie von einer anerkannten certificate authority-Zertifikat im user ‘ s Browser. Jedoch, es kann nicht verwendet werden zum verschlüsseln von privaten IP-Adressen, das ist, warum Sie müssen sich anmelden, ein cert selbst.

Generieren und Self-Sign-SSL-Zertifikat

Um dies zu tun, verwenden wir die openssl-Dienstprogramm. Sie wahrscheinlich haben Sie diese bereits installiert, da es eine Abhängigkeit von Nginx. Aber wenn es irgendwie fehlt, können Sie es von Ihrer Distribution Paket-manager. Für Debian-basierte Systeme wie Ubuntu, das wäre:

sudo apt-get install openssl

Nach dem openssl installiert ist, können Sie das Zertifikat generieren Sie mit dem folgenden Befehl:

sudo openssl req -x509 -nodes-days 365 -newkey rsa:2048 -keyout /etc/ssl/private/Apache.key -out /etc/ssl/certs/Apache.crt

Sie werden aufgefordert, einige Informationen über Ihre Organisation. Denn dieses ist selbst-signiert wurde, ist die einzige, die wirklich zählt, ist “Common Name”, die sollte eingestellt sein, Ihren domain-Namen oder die IP Ihres Servers.

Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, vollständig qualifizierte host-name) []: your_ip_address
E-Mail-Adresse []:

Das dauert eine Sekunde, um einen neuen zu generieren private RSA-Schlüssel, verwendet, um das Zertifikat zu signieren, und speichern Sie es in /etc/ssl/private/Apache.Schlüssel. Das Zertifikat selbst ist gespeichert in /etc/ssl/certs/Apache.crt, und ist gültig für ein ganzes Jahr.

Wir wollen auch zum generieren eines Diffie-Hellman-Gruppe. Das ist für die perfect forward secrecy, das erzeugt kurzlebige Schlüssel (session keys), um sicherzustellen, dass die vergangene Kommunikation kann nicht entschlüsselt werden, wenn der session-key kompromittiert wird. Dies ist nicht ganz notwendig für die interne Kommunikation, aber wenn Sie wollen, um so sicher wie möglich zu gestalten, sollten Sie nicht überspringen Sie diesen Schritt.

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

Dies dauert eine Weile—etwa eine Stunde-je nachdem, wie schnell Ihr server ist. Schnappen Sie sich etwas zu Essen, und kommen zurück, um Ihr terminal in ein bit zu konfigurieren Nginx.

Konfigurieren Nginx zu Verwenden Ihren Privaten Schlüssel und das SSL-Zertifikat

, Dinge einfach zu machen, wir werden die ganze Konfiguration in einer snippet-Datei, können wir auch in unserem nginx-server blockt. Erstellen Sie einen neuen Codeausschnitt Konfiguration in nginx das snippets Verzeichnis:

touch /etc/nginx/snippets/self-signed.conf

Öffnen Sie es in Ihrem Lieblings-text-editor, und fügen Sie die folgenden in:

ssl_certificate /etc/ssl/certs/Apache.crt;
ssl_certificate_key /etc/ssl/private/Apache.Schlüssel;

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers auf;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets aus;
ssl_stapling auf;
ssl_stapling_verify auf;
resolver 8.8.8.8 8.8.4.4 gültig=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection “1; mode=block”;

ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ecdh_curve secp384r1;

Die ersten beiden Zeilen dieses snippet konfigurieren nginx nutzen Sie unsere self-made-Zertifikat und einem privaten Schlüssel. Der nächste block ist generell SSL-Einstellungen, und schließlich werden die letzten zwei Zeilen konfigurieren nginx nutzen Sie unsere Diffie-Hellman-Gruppe für vorwärts-Sicherheit. Können Sie auslassen, wenn Sie keine Lust mehr hatte zu warten.

Die einzige andere Sache, die zu aktivieren wäre HTTP Strict Transport Security, die die Konfiguration Ihrer Website verwenden immer SSL. Dies würde einen permanenten redirect von HTTP zu HTTPS, so sollten Sie sicherstellen, dass SSL funktioniert, bevor ermöglicht.

Nun, ändern Sie Ihre primäre nginx-Konfiguration (befindet sich normalerweise unter /etc/nginx/nginx.conf für einzelne Seiten, oder unter Ihren domain-Namen in /etc/nginx/sites-available for multi-site-Servern), und die Quelle der snippet:

server {
listen 443 ssl;
listen [::]:443 ssl;

gehören snippets/self-signed.conf;

server_name example.com www.example.com;
. . .
}

Sie wollen auch die Einrichtung einer Weiterleitung von HTTP zu HTTPS, die Sie tun können, mit einen zusätzlichen server block lauscht auf port 80:

server {
listen 80;
listen [::]:80;

server_name example.com www.example.com;

zurück 302 https://$server_name$request_uri;
}

Dies ist eine 302-Weiterleitung, die nur vorübergehend ist. Sie wollen umstellen auf 301 wenn alles richtig funktioniert.

Testen Sie die Konfiguration durch einen Neustart von nginx:

sudo service nginx restart

Da HTTPS-Datenverkehr verwendet port 443, die Sie benötigen, um zu konfigurieren Sie Ihre firewalls zu ermöglichen Verkehr über diesen port. Wenn du mit iptables oder UFW, müssen Sie die ports öffnen aus der Kommandozeile. Wenn Sie ein hosting-Diensten wie AWS, der hat eine integrierte firewall, müssen Sie auch öffnen, Sie aus Ihrer web-Schnittstelle.

Wenn Ihr service ist, die ganz in Ihrem LAN, möchten Sie vielleicht, um die whitelist Ihres spezifischen Subnetz der IP-Adressen deaktivieren Sie den Zugriff von außerhalb des LAN, und Zugriff auf Ihre Server über eine VPN-Verbindung.

Wenn alles korrekt funktioniert, sollten Sie nun in der Lage, Zugriff auf Ihre server über HTTPS. Können Ihren web-browser display eine Warnung wie diese:

Keine Sorge, das wird erwartet, und der Grund, warum Sie nicht verwenden können diese Zertifikate für die client-websites. Müssen Sie manuell bestätigen, dass Sie diesem server Vertrauen, um es zu erreichen.

Die Warnung angezeigt, hier ist etwas irreführend—Ihre Seite sicher ist, solange der private Schlüssel nicht kompromittiert, und es ist vollkommen sicher, wenn Sie die Diffie-Hellman forward secrecy. Das problem liegt in der Identität, als Chrome kann nicht überprüfen, ob Ihr server ist, der er sagt, es ist, weil Sie signiert das Zertifikat selbst.

Sobald Sie überprüft haben, dass es keine Probleme mit SSL haben, können Sie die HTTP-Umleitung zu einer 301-Weiterleitung:

return 301 https://$server_name$request_uri;

Und nginx neu starten um die änderungen zu übernehmen.