Debian jessie nginx con openssl 1.0.2 per usare ALPN piuttosto che NPN


14

Sto eseguendo debian jessie sul mio server e recentemente aggiornato al nuovo server Web nginx con supporto http / 2 (nginx 1.10). Come oggi, funziona benissimo e il webserver fornisce contenuti con protocollo http2.

Ho letto che Chrome sta abbandonando il supporto NPN e consente ALPN solo dopo il 15.5.2016. ALPN è un'estensione, che richiede openssl 1.0.2 installato, ma su debian jessie è solo openssl 1.0.1 (anche su backport debian e altri repository, per questo debian non esiste una versione di openssl 1.0.2).

E c'è il problema: sono passato da SPDY a http2 e in pochi giorni dovrò disattivare http2 e non posso usare SPDY perché questa versione di nignx ha solo http2. Ho anche letto che questa versione di debian sarà bloccata con openssl 1.0.1 e che solo il tratto debian avrà openssl 1.0.2. Ma per la data di rilascio c'è quasi un anno e Chrome abbandonerà presto il supporto, quindi non voglio perdere il vantaggio del protocollo http2.

Esiste una soluzione, come installare openssl 1.0.2 su questo sistema, senza creare la propria build (cattiva manutenzione) o attendere che il repository backport lo abbia? Inoltre, non voglio due versioni di openssl sul mio sistema se una di esse deve essere collegata e gestita manualmente.

Grazie per qualsiasi aiuto.


È possibile utilizzare apt pinninge utilizzare opensslda Debian stretch.
gf_

@gf_ Con un rischio molto elevato di rompere il sistema. Molte cose dipendono da OpenSSL.
Michael Hampton

@MichaelHampton Beh, non posso giudicare il livello di rischio, dubito che sia molto alto. Io vado con Kurt Roeckx, uno dei manutentori, che ha cercato di entrare 1.0.2in jessieappena poco dopo il congelamento (che è stata respinta allora):. "Questa versione dovrebbe essere compatibile con la versione 1.0.1 non mi aspetto nulla interrompere il passaggio da 1.0.1 a 1.0.2. " (Ne sarei più consapevole libc6.)
gf_

@gf_ "Ottenere" in quel contesto richiederebbe la ricompilazione di tutto ciò che utilizza OpenSSL. Non mi sorprende che ciò sia stato respinto; A Debian piace il vecchio e il stabile. Nel contesto del tuo suggerimento, significa anche inserire in ogni pacchetto stretch che utilizza OpenSSL, e questo è un sacco di cose.
Michael Hampton

@MichaelHampton Sono abbastanza consapevole delle politiche di Debian e non sono sorpreso anche che questo sia stato respinto allora (non volevo dirlo o creare questa impressione). Ma: (forse la mia formulazione non era corretto): Fare apt-get install -t stretch nginx(su una vaniglia Debian jessiecon nginxinstallato) tirerà in: 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. (Questi sono dieci pacchetti ..)
gf_

Risposte:


16

Aggiornamento 2016/08/08: nginx in jessie-backports(versione 1.9.10-1~bpo8+3contro la quale è stato creato openssl >= 1.0.2~. ALPNOra funziona se l'esecuzione jessierichiede solo i pacchetti da jessie-backports, non è più necessario estrarli stretch.

-

Risposta originale: ecco la mia risposta, secondo i commenti: a mio avviso, non ci sono molti modi per risolverlo ad oggi, 2016/05/09. Fondamentalmente devi provare in qualche modo per ottenere un moderno nginxnel tuo sistema, compilato contro >= openssl 1.0.2~.

Le uniche due opzioni che vedo attualmente: o compili per te stesso, cosa che non vuoi fare, il che è abbastanza comprensibile, o estrai pacchetti moderni dal Debian stretchtuo sistema. Ciò comporta alcuni rischi, perché stai mescolando un ambiente stabile con un altro, ma secondo me questi rischi sono piuttosto bassi, perché stai usando Debian.

Quindi, andiamo a provare questo:

  • Aggiungi il Debian stretchrepository al tuo apt sources. Non usare /etc/apt/sources.listper questo, ma invece usa un file dedicato all'interno /etc/apt/sources.list.d/per mantenerlo pulito, personalmente sto usando stretch.list.

    Metti queste linee lì dentro:

    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
    
  • Configura apt pinning per assicurarti di estrarre solo i pacchetti di Debian stretchcui stai specificando. Il file da utilizzare per questo è /etc/apt/preferences, lì dentro, mettere:

    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
    

    (Potrebbe essere necessario modificare le suite e le priorità per adattarle al proprio ambiente.)

  • Esegui apt-get update(tramite sudo/ as root) per aggiornare la cache del pacchetto.

  • Installa nginxda Debian stretch: apt-get install -t stretch nginx(fallo tramite sudo/ as root). Profitto!

  • Come ho descritto nei miei commenti, anche per ridurre i rischi, potresti usare qualcosa come un chroot o una soluzione contenitore come LXC . Nel caso in cui tu voglia seguire la chrootstrada, devi impostare un'interfaccia di rete al suo interno: per fare questo, dai un'occhiata a questo post del blog, ad esempio , che fornisce un'introduzione a network namespaces.

  • Spero che sia di aiuto; nel caso abbiate più domande, non esitate a contattarmi. Gradirei feedback e sono interessato a come va.


Ho installato nginx oggi con la descrizione della tua risposta e tutto sembra funzionare alla grande! L'unica cosa, che dovevo fare di più, era rimuovere la vecchia installazione di nginx, perché avevo nginx 1.10 dal repository nginx e quella versione non è compatibile con il pacchetto di repository debian (ma l'ho fatto anche quando stavo aggiornando da debian nginx a 1.10, quindi non è stato un problema). Grazie per l'impegno e l'aiuto!
Juraj Nemec,

@JurajNemec Great! Grazie tante per il feedback! Hai già verificato il ALPNsupporto?
gf_

Sì. Controllato da http2 test e SSL Labs test , entrambi gli stati, indica che esiste il supporto ALPN. nginx -VFornisce inoltre informazioni sulla compilazione della versione con openssl 1.0.2+. Quindi penso che funzioni correttamente.
Juraj Nemec,

@JurajNemec Ottimo, suona bene! Se possibile per te, sarei interessato a ricevere un piccolo aggiornamento dopo aver eseguito questa configurazione per un po ', forse quattro o otto settimane. Grazie!
gf_

@JurajNemec Sembra che Google abbia effettuato il passaggio e rimosso NPN. La tua configurazione funziona ancora come previsto?
gf_

11

Un altro metodo consiste nell'installare OpenSSL 1.0.2 da jessie-backports e utilizzare le build Ubuntu 16.04 LTS dal repository di nginx. In questo modo stai almeno usando un pacchetto OpenSSL creato per Jessie.

Aggiungere a /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

Quindi eseguire:

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

Questo ovviamente ti mette in una configurazione ufficialmente non supportata, ma forse è meglio che non avere affatto un pacchetto - e ha funzionato per me. Inoltre, l'utilizzo del repository di nginx significa ottenere nuovi aggiornamenti.


Potresti per favore elaborare / chiarire perché si dovrebbe seguire questa strada? Per quanto riguarda "Inoltre, l'utilizzo del repository di nginx significa che ricevi nuovi aggiornamenti": ricevi anche "nuovi aggiornamenti" usando il modo che ho descritto.
gf_

I pacchetti di nginx vengono aggiornati lo stesso giorno della loro versione, perché fanno parte del loro processo di rilascio, non del processo di rilascio di Debian. Ho incluso i pacchetti mainline, non i pacchetti stable, ma puoi diventare stabile semplicemente rimuovendo / mainline nei percorsi precedenti. Quale preferisci dipende da te.
GreenReaper,

Per espandere quanto sopra: stretch è l'attuale versione di "testing", e quindi ha un ritardo minimo basato sul tempo necessario per passare dal test ; e questo presuppone che lo renda immediatamente instabile - ad esempio, 1.10.0 è stato rilasciato il 26 aprile , ma è stato spostato fino al 29 aprile instabile e migrato per allungarsi il 5 maggio ( vedi PTS ).
GreenReaper,

1
Sono abbastanza consapevole di questi fatti, grazie. :) Penso che la domanda si riduce a se si hanno bisogno di "nuovi pacchetti" (solo perché (?)) Se si cerca di fornire servizi stabili. AFAIK, molte persone scelgono Debian (e questo è il sistema operativo di cui si tratta) perché è stabile. Esistono alcuni rischi legati all'esecuzione di nuove versioni del software. Comunque, suppongo che non ci sia una regola generale su come gestirla, perché ambienti, aspettative e bisogni sono diversi. Inoltre: grazie per il tuo contributo, sono sicuro che abbia valore per le persone; le mie battute prima non significano alcun tipo di offesa.
gf_

1
Come dici tu, è una questione di laurea. Se vuoi essere al limite, puoi compilare build quotidianamente. Nel mio caso, essendo almeno sul leader bordo la tecnologia-saggio è un plus. Lo stesso ALPN non è probabilmente necessario per la maggior parte dei siti, ma è fortemente desiderato da coloro che desiderano utilizzare HTTP / 2 (specialmente se lo avessi usato in precedenza durante l'utilizzo di NPN); e questo gruppo target ha anche maggiori probabilità di essere interessato al tipo di funzionalità che compaiono in nginx mainline prima di stabile. Gestisco dieci nodi di cache e in genere lo provo su uno più piccolo per testarlo sotto carico prima di distribuirlo ulteriormente.
GreenReaper,

0

Un altro metodo consiste nell'utilizzare jessie-backport e quindi ricostruire facilmente nginx

aggiungere a /etc/apt/sources.list backport

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

e quindi esegui come root

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

e quindi ricostruire nginx. Seguire le istruzioni su https://wiki.debian.org/BuildingAPackage


"[...] O compili per te stesso, cosa che non vuoi fare [...]"
gf_

0

Per me il modo più semplice per risolvere questo problema era usare una diversa immagine Docker di Nginx, vedi la build ufficiale di Nginx su Docker Hub . La build Docker Nginx predefinita utilizza Debian Jessie in modo che non risolva il problema, ma offre anche una build alternativa basata su Alpine Linux . Le sue ultime build usano OpenSSL 1.0.2!

Questa soluzione presuppone quindi che Docker sia stato installato e che sia corretto eseguire Nginx Alpine Linuxanziché Debian Jessie.

Per avviare il contenitore Nginx:

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

Breve spiegazione per iniziare con Docker:

  • docker run: scarica l'immagine Docker (in questo caso nginx:1.11-alpine) se non lo hai ancora e avvia un contenitore Docker basato su questa immagine
  • --name nginx-container: dà un nome al contenitore Docker (è possibile visualizzare tutti i contenitori Docker in esecuzione utilizzando sudo docker pso utilizzare sudo docker ps -aanche per visualizzare i contenitori arrestati)
  • -p 80:80 -p 443:443: collega le porte 80 e 443 sul computer host rispettivamente alle porte 80 e 443 nel contenitore Docker
  • -v /path/to/your/nginx/directory/:/etc/nginx/: monta la directory sul sistema host che contiene la configurazione di Nginx sulla /etc/nginx/directory nel contenitore Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: monta una directory sul tuo sistema host che contiene file che vuoi che Nginx serva
  • -d: avvia il contenitore in background (è possibile arrestare il contenitore utilizzando docker stop nginx-container)
  • nginx:1.11-alpine: usa questa immagine per iniziare il tuo contenitore da (le immagini ufficiali di Nginx Docker sono elencate qui )

Utile anche:

  • utilizzare sudo docker exec nginx-container <command>per eseguire un comando nel contenitore, ad esempio sudo docker exec nginx-container nginx -s reloadper ricaricare Nginx dopo aver modificato i file di configurazione sul sistema host
  • Oppure usa sudo docker exec -it nginx-container bashper inserire una shell bash nel contenitore in modo da poter lavorare direttamente lì (non raccomandato, ma a volte utile)


0

Nella mia situazione ho usato il repository apt di Dotdeb. Le istruzioni di questo sito Web offrono un'opzione per aggiungere un repository che consente di installare Nginx con il supporto HTTP2 "completo". La versione attuale è la 1.14, che è una delle secondarie rispetto all'ultima versione, quindi non sarai troppo indietro (il backport attuale è la 1.10).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.