nginx: Strong SSL Security on nginx

Beim Prüfen der nginx SSL-Konfiguration bin ich auf folgende Seite gestossen: Raymii.org: Strong SSL Security on nginx. Hier wird ausführlich beschrieben wie man die SSL-Konfiguration seines nginx Webserver stärkt. Eine weitere aktuellere Seite ist: sherbers.de: Sichere TLS Konfiguration mit NGINX.

Prüfen kann man die Konfiguration auf: ssllabs.com

Hat man die wichtigsten Einstellungen vorgenommen, sollte der SSL-Report mindestens eine A Bewertung anzeigen.

SSL-Report Bewertung
SSL-Report „monsterli.ch“ Bewertung

 

Nützliche Links:

Raymii.org: Strong SSL Security on nginx

sherbers.de: Sichere TLS Konfiguration mit NGINX

ssllabs.com: SSL Server Test

 

 

C#: Prüfen ob die Datenbankverbindung auf den SQL – Server verschlüsselt wird

Muss die Datenbankverbindung von einer C#-Applikation zum SQL-Server verschlüsselt werden, muss der SQL-Server mit einem Zertifikat korrekt konfiguriert sein. Im weiteren müssen im ConnenctionString Parameter konfiguriert werden, damit eine verschlüsselte Verbindung hergestellt wird. Dazu wird der ConnenctionString mit folgenden Parametern versehen:

  • encrypt=true SSL Encryption aktivieren.
  • trustServerCertificate=false Zertifikat wird validiert. (Bei self-signed Zertifikaten auf „true“ setzen)

Wird nun mit der C#-Applikation eine Verbindung auf den SQL-Server hergestellt, sollte die Verbindung verschlüsselt sein. Wie kann man sich jedoch sicher sein? Eine Möglichkeit ist die Verwendung eines „Sniffers“, wie WireShark, oder aber man prüft dies auf dem SQL-Server selber.

Auf dem SQL-Server kann man folgende SQL-Abfrage absetzen, um alle Verbindungen mit ihren Verschlüsselungsoptionen anzuzeigen:


SELECT session_id,encrypt_option
FROM sys.dm_exec_connections

session_id  encrypt_option
----------- ----------------------------------------
73          TRUE
73          TRUE
73          TRUE
75          FALSE
76          FALSE

Bei den Verbindungen mit der SessionId 73 sehen wir, dass die Verschlüsselung aktiviert und verwendet wird. (encryption_option = true)

Nützliche Links

SQL Server SSL Troubleshooting Steps
Connection Properties
TrustServerCertificate Property

Kostenloses StartSSL Serverzertifikat einrichten beim NGINX Webserver

Achtung:
Mozilla und Google haben der Zertifizierungsstelle das Vertrauen entzogen, somit werden die meisten StartSSL-Zertifikate nicht mehr als vertrauenswürdig anerkannt. Als eine gute und freie Alternative kann Let’s Encrypt eingesetzt werden.

Zum Installieren eines kostenloses StartSSL-Zertifikates auf einem NGINX Webserver, braucht es folgende Schritte:

  1. Ein Zertifikat bei StartSSL erstellen
  2. Den neu erstellten privaten Schlüssel mit „Copy & Paste“ in eine Datei, mit den Namen ssl.key, speichern
  3. Die Datei ssl.key mit einem geeigneten Tool, beispielsweise WinSCP für Windows Benutzer, auf den Webserver kopieren
  4. Mit Hilfe von OpenSSL muss der private Schlüssel, auf dem Server, entschlüsselt gespeichert werden: openssl rsa -in ssl.key -out server.key
    (Hinweis zur Passworteingabe bei verwendung von Putty: Möchte man nicht die >= 32 Stellige „PEM pass phrase“ von Hand abtippen, kann diese mit „shift+Ins“ eingefügt werden.)
  5. Wenn das Webseiten-Zertifikat durch StartSSL erstellt wurde, erhält man eine Benachrichtigung und kann das Zertifikat unter: Control Panel-> Tool Box-> Retrieve Certificate beziehen. Dazu wieder mit „Copy & Paste“ in eine Datei namens ssl.cert speichern und zum Webserver kopieren
  6. Nach diesem Schritt muss noch ein Gesamtpaket mit den Hilfszertifikaten von StartSSL und dem Webseiten-Zertifikat erstellt werden, da beim NGINX Webserver diese Zertifikate nicht einzeln in der Konfiguration angegeben werden. Die Hilfszertifikate können bei StartSSL heruntergeladen werden. Um das Gesamtpaket zu erstellen, braucht es für die kostenlosen Zertifikate die Dateien ca.pem und sub.class1.server.ca.pem. Mit dem Befehl:
    cat ssl.cert ca.pem sub.class1.server.ca.pem > server.pem
    werden alle Dateien in die Datei server.pem zusammengefasst.
  7. Nun die Dateien „server.pem“ und „server.key“ in das gewünschte Verzeichnis kopieren. Hier in diesem Beispiel nach „/etc/nginx/cert/“.
  8. Jetzt muss noch die NGINX Konfiguration angepasst werden:
    server {
        listen   443;
        ssl on;
        ssl_certificate /etc/nginx/cert/server.pem;
        ssl_certificate_key /etc/nginx/cert/server.key;
        server_name  www.example.org;
        root /var/www/example;
        location / {
            index  index.html;
        }
    }
  9. Zum Abschluss wird noch ein Neustart von NGINX durchgeführt.(/etc/init.d/nginx restart) Wenn beim Neustart keine Fehlermeldung in der Konsole erscheint, ist das Zertifikat erfolgreich installiert worden.

Hinweis: Sollte NGINX nicht mehr starten und eine ähnliche Fehlermeldung wie:

[emerg]: SSL_CTX_use_certificate_chain_file("/etc/nginx/cert/server.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory error:20074002:BIO routines:FILE_CTRL:system lib error:140DC002:SSL routines:SSL_CTX_use_certificate_chain_file:system lib)
configuration file /etc/nginx/nginx.conf test failed

in der Konsole angezeigt werden, dann deutet dies auf einen fehlenden Zeilenumbruch in der Datei server.pem hin.

NGINX - Fehler in der server.pem Datei
Fehlender Zeilenumbruch in der .PEM Datei
Einfach den Zeilenumbruch korrigieren und die Datei speichern. Nach der Korrektur sollte NGINX wieder erfolgreich starten.
Zeilenumbruch korrigiert
Zeilenumbruch korrigiert