Nginx kompilieren

Ja, das Internet ist sicherer geworden. Seit Edward Snowden die Machenschaften der NSA öffentlich gemacht hat, ist das Thema 'Sicherheit im Internet' wichtig geworden. Immerhin, die meisten Seiten im WWW sind mittlerweile verschlüsselt. Dies ist erkennbar an der Protokollbezeichnung 'https' vor dem Domänennamen in der Adressleiste des Browsers. Davor ist noch ein grünes Schlosssymbol zu sehen.

Soweit, so gut, könnte man meinen. Doch wie sicher ist die Verschlüssellung des Datenverkehrs zwischen dem Browser und dem Webserver im Internet? Na ja, das hängt unter anderem vom Verschlüssellungsprotokoll ab. Veraltete Verschlüssellungen werden nicht mehr als sicher betrachtet. MD5 ist bereits geknackt worden. Die beim Datenverkehr zwischen Browser und dem WWW genutzten Protokolle werden TLS (Transport Layer Security, Transportschichtsicherheit) genannt. Mittlerweile ist der Standard TLSv1.2 - dank kostenloser Letsencrypt-Zertifikate auch bei vielen privaten Seiten - üblich.

Moderne Browser warnen beim Betreten unverschlüsselter Seiten. Es ist nur noch eine Frage der Zeit, bis ältere Verschlüssellungsvarianten, z.B. TLSv1, die momentan auch noch verbreitet sind, mit Browserwarnungen versehen sind. Klickt man im Firefox auf auf das 'Seiteninformationen anzeigen'-Symbol in der Adressleiste, kann man die TLS-Protokollvariante erfahren. In diesem Fall ist es also TLSv1.2, das ist der aktuelle Standard.  TLS-Protokollvariante

Ist somit die Internetwelt in Ordnung? Mitnichten! Selbst Phishing-Seiten sind mittlerweile verschlüsselt und große Internetkonzerne, wie Google, Microsoft usf., wissen ohnehin recht genau, was der Internetnutzer so treibt.

Abgesehen davon, hat TLSv1.2 bereits einen Nachfolger: TLS1.3 - OpenSSLWiki.

Fertige Binarys für Nginx unter Windows sind von der (unverschlüsselten :-?) Projektseite nginx.org/en/download.html zu bekommen. Startet man diesen Webserver mit dem Befehl nginx -V, werden u.a. die einkompilierten Module angezeigt. Nginx nutzt OpenSSL 1.0.2p . Diese OpenSSL-Version ist nicht TLSv1.3-fähig.

Nginx ist also selbst aus den Quellen zu kompilieren. Was ist konkret zu tun?

Zielsetzungen definieren

  • Gleicher Funktionsumfang wie bei den Windows-Version der Seite nginx.org/en/download.html
  • Es soll TLSv1.3 hinzugefügt werden
  • Nginx soll auf 32- und 64-Bit-Systemen laufen
  • Versionen, Module und Optionen zeigt der Befehl nginx -V an

Versionen, Module und Optionen

Entwicklungsumgebung erstellen

Man nehme installiere folgende kostenlose Programmierumgebungen auf einem Windows 10-PC:

Außerdem sind Pfade zu erstellen bzw. deren Existenz zu prüfen

(Erweiterte Systemeinstellungen → Umgebungsvariablen → Systemvariablen → Path) :

  • C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build;
  • C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86;
  • D:\perl\site\bin;
  • D:\perl\bin;
  • D:\MinGW\bin;
  • D:\MinGW\msys\1.0;

Wie man sieht, ist bei diesem Rechner Visual Studio auf Laufwerk C, und MSYS und Perl auf Laufwerk D: installiert.

Pakete besorgen und entpacken

Quellcode Link zum Archiv
Webserver Nginx, aktuelle Version Nginx inkl. Configure-Skript
Kompressionsbibliothek zlib 1.2.11 zlib
Perl Compatible Regular Expressions pcre- 8.4.2 pcre-8.4.2
OpenSSL-1.1.1 OpenSSL

Wohin damit?

Der Basisordner für den Quellcode lautet: D:\MinGW\msys\1.0\home\[benutzername]\ Alle Archive sind mit 7-Zip zu entpacken. Im Ordner D:\MinGW\msys\1.0\home\[benutzername]\nginx\ ist die Ordnerstruktur objs\lib zu erstellen. Perl, OpenSSL und zlib gehören in den Ordner objs\lib. Die Ordnerstruktur sollte dann so aussehen:

Konfigurieren

  • Eine Konsole öffnen: Win+R, cmd Ok
  • Darin den Befehl vcvarsall.bat x86 ausführen
  • Anschließend msys starten
  • In msys mit cd nginx den Ordner nginx betreten
  • Anschließend folgende Zeilen der Datei configure.txt vollständig markieren und in die Zwischenablage kopieren, mit Strg+V in msys einfügen und mit Enter bestätigen

configure.txt
auto/configure \
    --with-cc=cl \
    --with-debug \
    --prefix= \
    --conf-path=conf/nginx.conf \
    --pid-path=logs/nginx.pid \
    --http-log-path=logs/access.log \
    --error-log-path=logs/error.log \
    --sbin-path=nginx.exe \
    --http-client-body-temp-path=temp/client_body_temp \
    --http-proxy-temp-path=temp/proxy_temp \
    --http-fastcgi-temp-path=temp/fastcgi_temp \
    --http-scgi-temp-path=temp/scgi_temp \
    --http-uwsgi-temp-path=temp/uwsgi_temp \
    --with-cc-opt=-DFD_SETSIZE=1024 \
    --with-pcre=objs/lib/pcre-8.42 \
    --with-zlib=objs/lib/zlib-1.2.11 \
    --with-openssl=objs/lib/openssl-1.1.1 \
    --with-openssl-opt=no-asm \
    --with-select_module \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_gunzip_module \
    --with-http_mp4_module \
    --with-http_flv_module \
    --with-http_sub_module \
    --with-http_stub_status_module \
    --with-http_dav_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_secure_link_module \
    --with-http_gzip_static_module \
    --with-http_auth_request_module \
    --with-http_random_index_module \
    --with-http_slice_module \
    --with-mail \
    --with-stream \
    --with-mail_ssl_module \
    --with-stream_ssl_module
  • Nach kurzer Zeit ist die Konfiguration abgeschlossen:

Kompilieren und linken

  • In der msys-Konsole führen Sie den Befehl nmake aus.
  • Der Compilier- und Link-Vorgang dauert mehrere Minuten… :!:
  • Wenn der Compiler fehlerfrei durchgelaufen ist, finden Sie im Ordner nginx\objs die ausführbare Datei nginx.exe

Testen

Getestete Betriebssysteme

  • Windows 10 Pro x64
  • Windows 10 Home x86

Funktionsumfang, Module, Versionen und Optionen anzeigen

  • In der Konsole nginx -V aufrufen

TLS und http2 testen

  • Mit der selbsterstellten Datei nginx.exe die entsprechende Datei im Projekt wemp2go ersetzen.
    • Datei ssl-tls-v1.0_v1.2.server.conf in ssl-tls-v1.0_v1.2.server.conf.off umbenennen.
    • Datei ssl-tls-v1.3.server.conf.off in ssl-tls-v1.3.server.conf umbenennen.
    • wemp2go starten
    • In die Aressleiste des Firefox-Browsers https://localhost/ eingeben.
    • Nutzen Sie Firefox mit aktiviertem HTTP/2 Indicator-Addon, zwigt ein kleines Blitzsymbol rechts in der Adressleiste an, dass http2 genutzt wird.
    • In den Verbindungsdetails öffenen Sie den Dialog „Seiteninformationen“ und prüfen nach, ob TLSv1.3 tatsächlich genutzt wird.

Typische Fehler und Probleme

  • Der Configure-Vorgang bricht ab.
    • Sind die Module im richtigen Unterorder [Lfw:]:\MinGW\msys\1.0\home\[Benutzername]\nginx\objs\lib gespeichert?
    • Sind die Configure-Parameter fehlerfrei? Hinter dem Schrägstrich an den Zeilenenden darf kein Leerzeichen sein. :!:
  • Der Befehl nmake bzw. vcvarsall.bat wird nicht gefunden.
    • Stimmen die Pfadangaben zu Visual Studio?
  • nmake bricht mit Fehlermeldungen ab.
    • Haben Sie in der Konsole zuerst vcvarsall x86 ausgeführt?
    • Stimmen die Pfadangaben für ActivePerl?
    • Stimmt die Verzeichnisstrukur der Quelldateien?
    • Haben Sie weitere MinGW-Komponenten installiert?
      • Gibt es im Ordner [Lfw:]:\MinGW\msys\1.0\bin einen weiteren Perl-Interpreter perl.exe? Falls ja, sollte dieser umbenannt werden, z.B. perl.exe.backup.
      • Gibt es im Ordner [Lfw:]:\MinGW\msys\1.0\bin ein weiteres Link-Programm link.exe? Falls ja, sollte dieses umbenannt werden, z.B. link.exe.backup.
  • Der Browser warnt vor einer unsicheren https-Verbindung.
    • Der öffentliche Schlüssel ist nicht bei einer Zertifizierungsstelle registriert. Fügen Sie eine Ausnahme im Browser hinzu.
  • Der Browser meldet, dass ein veraltetes Protokoll genutzt wird.
    • Diese Meldung stammt vermutlich vom Internet Explorer bzw. von Microsoft Edge. Nutzen Sie einen aktuellen Firefox- oder Chrome-Browser.

Quellen