Debian jessie nginx mit openssl 1.0.2 verwendet ALPN anstelle von NPN

14

Ich verwende debian jessie auf meinem Server und habe kürzlich ein Upgrade auf einen neuen nginx-Webserver mit http / 2-Unterstützung (nginx 1.10) durchgeführt. Wie heute funktioniert es hervorragend und der Webserver liefert Inhalte mit dem http2-Protokoll.

Ich habe gelesen, dass Chrome die NPN-Unterstützung einstellt und ALPN erst nach dem 15.5.2016 zulässt. ALPN ist eine Erweiterung, für die openssl 1.0.2 installiert sein muss, aber unter debian ist jessie nur openssl 1.0.1 (auch unter debian-backports und anderen repositories gibt es keine openssl 1.0.2-version für dieses debian).

Und da ist das Problem - ich habe ein Upgrade von SPDY auf http2 durchgeführt und in wenigen Tagen muss ich http2 ausschalten und kann SPDY nicht verwenden, da diese Version von nignx nur http2 hat. Ich habe auch gelesen, dass diese Version von Debian bei OpenSSL 1.0.1 bleiben wird und nur Debian Stretch OpenSSL 1.0.2 haben wird. Aber zum Veröffentlichungsdatum ist es fast ein Jahr und Chrome wird bald den Support einstellen, sodass ich den Vorteil des http2-Protokolls nicht verlieren möchte.

Gibt es eine Lösung, wie Sie openssl 1.0.2 auf diesem System installieren können, ohne ein eigenes Build (schlechte Wartung) zu erstellen oder darauf zu warten, dass das Backports-Repository es hat? Ich möchte auch nicht zwei Versionen von openssl auf meinem System, wenn eine von ihnen manuell verknüpft und gepflegt werden muss.

Danke für jede Hilfe.

Juraj Nemec
quelle
Sie könnten nutzen apt pinningund verwenden opensslaus Debian stretch.
gf_
@gf_ Mit einem sehr hohen Risiko, Ihr System zu beschädigen. Viele Dinge hängen von OpenSSL ab.
Michael Hampton
@MichaelHampton Nun, ich kann nicht beurteilen, wie hoch das Risiko ist, ich bezweifle, dass es sehr hoch ist. Ich werde mit Kurt Roeckx, einer der Maintainer, der versucht zu bekommen 1.0.2in jessienur kurz nach dem Einfrieren (der damals abgelehnt wurde). „Diese Version soll mit der 1.0.1 - Version kompatibel sein , die ich erwarte nichts von 1.0.1 auf 1.0.2 verschieben zu brechen. " (Ich wäre mir dessen bewusster libc6.)
gf_
@gf_ "Getting it in" in diesem Kontext würde das Neukompilieren von allem erfordern, was OpenSSL verwendet. Ich bin nicht überrascht, dass dies abgelehnt wurde. Debian mag alt und stabil. Im Kontext Ihres Vorschlags bedeutet dies auch, jedes Stretch-Paket, das OpenSSL verwendet, einzupacken, und das ist eine Menge Zeug.
Michael Hampton
@MichaelHampton Ich bin mir der Debian-Richtlinien ziemlich bewusst und bin auch nicht überrascht, dass dies damals abgelehnt wurde (wollte dies nicht sagen oder diesen Eindruck erwecken). Aber: (vielleicht meine Formulierung war falsch): Handeln apt-get install -t stretch nginx(auf einer Vanille Debian jessiemit nginxinstalliert) wird in ziehen: nginx nginx-common nginx-full libnginx-mod-http-auth-pam libnginx-mod-http-geoip libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libssl1.0.2. (Dies sind zehn Pakete ..)
gf_

Antworten:

16

Update 08.08.2016: nginx in jessie-backports(Version 1.9.10-1~bpo8+3wurde gegen gebaut openssl >= 1.0.2~. ALPNJetzt zum Laufen zu kommen, jessieerfordert nur das Herausziehen der Pakete, es jessie-backportsist nicht mehr nötig, die Pakete herauszuziehen stretch.

-

Originale Antwort: Nun, hier ist meine Antwort laut den Kommentaren: Meiner Meinung nach gibt es ab heute, dem 09.05.2016, nicht so viele Möglichkeiten, dies zu lösen. Grundsätzlich muss man irgendwie versuchen , eine moderne nginxin Ihr System zu bekommen , gegen die kompiliert wird >= openssl 1.0.2~.

Die einzigen zwei Optionen, die ich derzeit sehe: Entweder kompilieren Sie für sich selbst, was Sie nicht tun möchten, was durchaus verständlich ist, oder Sie ziehen moderne Pakete aus Debian stretchIhrem System heraus. Dies birgt einige Risiken, da Sie eine stabile Umgebung mit einer anderen mischen, aber meiner Meinung nach sind diese Risiken ziemlich gering, da Sie verwenden Debian.

Also, lass uns das ausprobieren:

  • Fügen Sie das Debian stretchRepository zu Ihrem hinzu apt sources. Verwenden Sie /etc/apt/sources.listdies nicht, sondern verwenden Sie stattdessen eine dedizierte Datei /etc/apt/sources.list.d/, um sie sauber zu halten, die ich persönlich verwende stretch.list.

    Setzen Sie diese Zeilen dort hinein:

    deb http://httpredir.debian.org/debian/ stretch main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch main contrib non-free
    
    deb http://security.debian.org/ stretch/updates main contrib non-free
    deb-src http://security.debian.org/ stretch/updates main contrib non-free
    
    # stretch-updates, previously known as 'volatile'
    deb http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    
  • Richten Sie apt pinning ein , um sicherzustellen, dass nur Pakete eingezogen werden, für Debian stretchdie Sie Angaben machen . Die dafür zu verwendende Datei enthält /etc/apt/preferences:

    Package: *
    Pin: release n=jessie
    Pin-Priority: 900
    
    Package: * 
    Pin: release a=jessie-backports
    Pin-Priority: 500
    
    Package: *
    Pin: release n=stretch
    Pin-Priority: 100
    

    (Möglicherweise müssen Sie die Suites und Prioritäten ändern, um sie an Ihre Umgebung anzupassen.)

  • Führen Sie apt-get update(via sudo/ as root) aus, um den Paket-Cache zu aktualisieren.

  • Installieren nginxvon Debian stretch: apt-get install -t stretch nginx(mache dies über sudo/ als root). Profitieren!

  • Wie ich in meinen Kommentaren beschrieben habe, könnten Sie, um die damit verbundenen Risiken noch zu verringern, so etwas wie eine Chroot oder eine Container-Lösung wie LXC verwenden . Wenn Sie den chrootWeg gehen möchten , müssen Sie dort eine Netzwerkschnittstelle einrichten: Schauen Sie sich dazu zum Beispiel diesen Blogpost an , der eine Einführung in gibt network namespaces.

  • Hoffe das hilft; Wenn Sie weitere Fragen haben, können Sie mich gerne kontaktieren. Ich würde mich über Feedback freuen und bin daran interessiert, wie es geht.

gf_
quelle
Ich habe heute nginx nach deiner Antwortbeschreibung installiert und alles scheint super zu funktionieren! Das einzige, was ich extra tun musste, war, die alte Nginx-Installation zu entfernen, da ich Nginx 1.10 aus dem Nginx-Repository hatte und diese Version nicht mit dem Debian-Repository-Paket kompatibel ist (aber ich habe dies auch getan, als ich ein Upgrade von Debian Nginx durchgeführt habe) bis 1.10 war es also kein problem). Vielen Dank für Ihre Mühe und Ihre Hilfe!
Juraj Nemec
@JurajNemec Großartig! Vielen Dank für das Feedback! Haben Sie ALPNbereits nach Unterstützung gesucht?
gf_
Ja. Überprüft durch http2-Test und SSL-Labs-Test , beide Staaten, dass es ALPN-Unterstützung gibt. nginx -VGibt auch Infos, dass die Version mit openssl 1.0.2+ kompiliert ist. Also ich denke, dass es richtig funktioniert.
Juraj Nemec
@JurajNemec Großartig, hört sich gut an! Wenn möglich, wäre ich daran interessiert, ein kleines Update zu erhalten, nachdem Sie dieses Setup für eine Weile ausgeführt haben, vielleicht vier oder acht Wochen. Vielen Dank!
gf_
@JurajNemec Es scheint, dass Google die Umstellung vorgenommen und NPN entfernt hat. Funktioniert Ihr Setup weiterhin wie erwartet?
gf_
11

Eine andere Methode ist die Installation von OpenSSL 1.0.2 aus jessie-backports und die Verwendung von Ubuntu 16.04 LTS-Builds aus dem nginx-eigenen Repository. Auf diese Weise verwenden Sie zumindest ein OpenSSL-Paket, das für Jessie erstellt wurde.

Hinzufügen zu /etc/apt/sources.list:

# jessie-backports, from stretch-level but with no dependencies
deb http://httpredir.debian.org/debian/ jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian/ jessie-backports main contrib non-free

# Nginx repository - use Ubuntu 16.04 LTS Xenial to get packages compiled with OpenSSL 1.0.2
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx

Dann renne:

apt-get update
apt-get install -t jessie-backports openssl
apt-get install nginx

Dies versetzt Sie offensichtlich in eine offiziell nicht unterstützte Konfiguration, aber vielleicht ist es besser, überhaupt kein Paket zu haben - und es hat bei mir funktioniert. Wenn Sie das Repo von Nginx verwenden, erhalten Sie außerdem neue Updates.

GreenReaper
quelle
Könnten Sie bitte erläutern, warum man diesen Weg gehen würde? In Bezug auf "Plus, wenn Sie das Repo von Nginx verwenden, erhalten Sie neue Updates.": Sie erhalten auch "neue Updates", wie ich es beschrieben habe.
gf_
Die Pakete von nginx werden am selben Tag wie ihre Veröffentlichung aktualisiert, da sie Teil ihres Veröffentlichungsprozesses sind und nicht Debians Veröffentlichungsprozess. Ich habe die Hauptpakete eingeschlossen, nicht die stabilen Pakete, aber Sie können stabil werden, indem Sie einfach / mainline in den obigen Pfaden entfernen. Was Sie bevorzugen, liegt bei Ihnen.
GreenReaper
Um das Obige zu erweitern: stretch ist die aktuelle 'Test'-Version und hat daher eine minimale Verzögerung, die davon abhängt, wie lange es dauert, sich vom Test zu entfernen . und das unter der Annahme, dass es sofort instabil wird - zum Beispiel wurde 1.10.0 am 26. April veröffentlicht , aber auf den instabilen 29. April verschoben und am 5. Mai auf Stretch migriert ( siehe PTS ).
GreenReaper
1
Ich bin mir dieser Tatsachen sehr bewusst, danke. :) Ich denke, die Frage läuft darauf hinaus, ob man "neue Pakete" braucht (nur weil (?)), Wenn man versucht, stabile Dienste bereitzustellen. AFAIK, viele Leute wählen Debian (und dies ist das Betriebssystem, um das es hier geht), weil es stabil ist. Es besteht ein gewisses Risiko, dass neue Softwareversionen ausgeführt werden. Aber ich denke, es gibt keine allgemeine Regel, wie man damit umgeht, da Umgebungen, Erwartungen und Bedürfnisse unterschiedlich sind. Außerdem: Vielen Dank für Ihre Eingabe, ich bin sicher, dass es für die Menschen von Wert ist. Meine vorherigen Zeilen bedeuten keine Beleidigung.
gf_
1
Wie Sie sagen, ist es eine Frage des Grades. Wenn Sie am Puls der Zeit sein möchten, können Sie Builds täglich kompilieren. In meinem Fall auf der zumindest vorläufig führende Spitzentechnologie-weise ist ein Plus. ALPN selbst ist wahrscheinlich für die meisten Sites nicht erforderlich, wird jedoch von denjenigen, die HTTP / 2 verwenden möchten (insbesondere, wenn Sie es zuvor bei der Verwendung von NPN hatten), sehr gewünscht. und diese zielgruppe ist auch eher an den merkmalen interessiert, die in mainline nginx vor stable auftauchen. Ich verwalte zehn Cacheknoten und probiere es normalerweise mit einem kleineren Knoten aus, um ihn unter Last zu testen, bevor ich ihn weiter ausbaue.
GreenReaper
0

Eine andere Methode besteht darin, Jessie-Backports zu verwenden und dann einfach Nginx neu zu erstellen

Fügen Sie zu /etc/apt/sources.list backports hinzu

deb http://ftp.debian.org/debian jessie-backports main

und dann als root ausführen

apt-get update
apt-get install -t jessie-backports openssl

und dann Nginx neu erstellen. Befolgen Sie die Anweisungen auf https://wiki.debian.org/BuildingAPackage

StanleyD
quelle
"[...] Entweder kompilierst du selbst, was du nicht machen willst [...]"
gf_
0

Für mich war es die einfachste Möglichkeit, dies zu beheben, ein anderes Nginx Docker-Image zu verwenden. Weitere Informationen finden Sie im offiziellen Nginx-Build auf Docker Hub . Der Standard-Build von Docker Nginx verwendet Debian Jessie, damit Ihr Problem nicht behoben wird. Sie bieten jedoch auch einen alternativen Build auf Basis von Alpine Linux . Die neuesten Builds verwenden OpenSSL 1.0.2!

Diese Lösung geht also davon aus, dass Sie Docker installiert und sind gut mit Nginx läuft auf Alpine Linuxstatt Debian Jessie.

So starten Sie Ihren Nginx-Container:

sudo docker run --name nginx-container -p 80:80 -p 443:443 -v /path/to/your/nginx/directory/:/etc/nginx/ /path/to/your/files/to/serve/:/usr/share/nginx/html/ -d nginx:1.11-alpine

Kurze Erklärung zum Einstieg in Docker:

  • docker run: Lädt das Docker-Image herunter (in diesem Fall nginx:1.11-alpine), wenn Sie es noch nicht haben, und startet einen Docker-Container, der auf diesem Image basiert
  • --name nginx-container: gibt dem Docker-Container einen Namen (Sie können alle laufenden Docker-Container anzeigen, indem Sie verwenden sudo docker psoder verwenden, sudo docker ps -aum auch angehaltene Container anzuzeigen)
  • -p 80:80 -p 443:443: Bindet die Ports 80 und 443 auf Ihrem Hostcomputer an die Ports 80 und 443 im Docker-Container
  • -v /path/to/your/nginx/directory/:/etc/nginx/: Hängt das Verzeichnis auf Ihrem Host-System, das Ihre Nginx-Konfiguration enthält, in das /etc/nginx/Verzeichnis im Docker-Container ein
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: Hängt ein Verzeichnis auf Ihrem Host-System an, das Dateien enthält, die Nginx bereitstellen soll
  • -d: startet den Container im Hintergrund (Sie können den Container mit stoppen docker stop nginx-container)
  • nginx:1.11-alpine: Verwenden Sie dieses Bild, um Ihren Container zu starten (die offiziellen Nginx Docker-Bilder sind hier aufgelistet ).

Auch nützlich:

  • Verwenden Sie sudo docker exec nginx-container <command>diese Option, um einen Befehl im Container auszuführen, z. B. sudo docker exec nginx-container nginx -s reloadum Nginx neu zu laden, nachdem Sie die Konfigurationsdateien auf dem Hostsystem geändert haben
  • Oder sudo docker exec -it nginx-container bashgeben Sie eine Bash-Shell in den Container ein, damit Sie direkt dort arbeiten können (nicht empfohlen, aber manchmal nützlich).
Sicco
quelle
0

Eine alternative Möglichkeit ist die Verwendung von BoringSSL, wodurch die OpenSSL-Umgebung nicht beeinträchtigt wird. Einzelheiten finden Sie unter https://www.admon.org/hardwares/enable-http2-support-for-nginx-on-debian-jessie

user402005
quelle
1
Nur-Link-Antworten sind in der Regel weniger hilfreich, nachdem Links abgelaufen sind. Bitte fügen Sie der Antwort den relevanten Teil der verlinkten Seite bei.
Sendmoreinfo
0

In meiner Situation habe ich das Dotdeb Apt-Repository verwendet. Die Anweisungen dieser Website bieten die Möglichkeit, ein Repository hinzuzufügen, mit dem Sie Nginx mit „vollständiger“ HTTP2-Unterstützung installieren können. Die aktuelle Version ist 1.14. Dies ist eine Nebenversion hinter der letzten Version, sodass Sie nicht zu weit zurückliegen (der aktuelle Backport ist 1.10).

HarmenB
quelle