Debian jessie nginx avec openssl 1.0.2 pour utiliser ALPN plutôt que NPN

14

J'utilise debian jessie sur mon serveur et j'ai récemment mis à niveau vers un nouveau serveur web nginx avec prise en charge http / 2 (nginx 1.10). Comme aujourd'hui, cela fonctionne très bien et le serveur Web fournit du contenu avec le protocole http2.

J'ai lu que Chrome supprime le support NPN et n'autorise ALPN qu'après le 15.5.2016. ALPN est une extension qui nécessite openssl 1.0.2 installé, mais sur debian jessie est uniquement openssl 1.0.1 (également sur les backports debian et autres référentiels, il n'y a pas de version openssl 1.0.2 pour ce debian).

Et il y a le problème - j'ai mis à niveau de SPDY vers http2 et dans quelques jours, je devrai désactiver http2 et ne pourra pas utiliser SPDY car cette version de nignx n'a que http2. J'ai également lu que cette version de debian restera avec openssl 1.0.1 et que seul debian stretch aura openssl 1.0.2. Mais pour la date de sortie, il y a presque un an et Chrome abandonnera bientôt le support, donc je ne veux pas perdre l'avantage du protocole http2.

Existe-t-il une solution, comment installer openssl 1.0.2 sur ce système, sans construire sa propre build (mauvaise maintenance) ou attendre que le dépôt backports l'ait? Je ne veux pas non plus que deux versions de openssl soient installées sur mon système si l'une d'elles doit être liée et maintenue manuellement.

Merci pour toute aide.

Juraj Nemec
la source
Vous pouvez utiliser apt pinninget utiliser opensslhors de Debian stretch.
gf_
@gf_ A un risque très élevé de casser votre système. Beaucoup de choses dépendent d'OpenSSL.
Michael Hampton
@MichaelHampton Eh bien, je ne peux pas juger du niveau de risque, je doute qu'il soit très élevé. Je vais avec Kurt Roeckx, l' un des mainteneurs, qui a essayé de 1.0.2s'en jessievient peu de temps après le gel (qui a été rejetée à l' époque). « Cette version doit être compatible avec la version 1.0.1 , je ne pense rien pour rompre le passage de 1.0.1 à 1.0.2. " (J'en serais plus conscient libc6.)
gf_
@gf_ "L'entrer" dans ce contexte nécessiterait de recompiler tout ce qui utilise OpenSSL. Je ne suis pas surpris que cela ait été rejeté; Debian aime l'ancien et stable. Dans le contexte de votre suggestion, cela signifie également extraire tous les packages extensibles qui utilisent OpenSSL, et c'est beaucoup de choses.
Michael Hampton
@MichaelHampton Je suis tout à fait au courant des politiques de Debian et je ne suis pas surpris non plus que cela ait été rejeté à l'époque (je ne voulais pas dire cela ou créer cette impression). Mais: (peut - être mon libellé était incorrect): Faire apt-get install -t stretch nginx(sur la vanille Debian jessieavec nginxinstallé) va tirer dans: 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. (Ce sont dix packages ..)
gf_

Réponses:

16

Mise à jour 2016/08/08: nginx dans jessie-backports(la version a 1.9.10-1~bpo8+3été construite contre openssl >= 1.0.2~. Se mettre au ALPNtravail maintenant si l'exécution jessiene nécessite que les packages jessie-backports, plus besoin de retirer les packages stretch.

-

Réponse originale: Eh bien, voici ma réponse, selon les commentaires: À mon avis, il n'y a pas beaucoup de façons de résoudre ce problème aujourd'hui, 2016/05/09. Fondamentalement, vous devez essayer d'une manière ou d'une autre d'intégrer un système moderne nginxdans votre système, compilé par >= openssl 1.0.2~.

Les deux seules options que je vois actuellement: soit vous compilez vous-même, ce que vous ne voulez pas faire, ce qui est tout à fait compréhensible, soit vous extrayez des packages modernes Debian stretchdans votre système. Cela implique certains risques, car vous mélangez un environnement stable avec un autre, mais à mon avis, ces risques sont assez faibles, car vous utilisez Debian.

Alors allons-y et essayons ceci:

  • Ajoutez le Debian stretchréférentiel à votre apt sources. Ne l'utilisez pas /etc/apt/sources.listpour cela, mais utilisez plutôt un fichier dédié à l'intérieur /etc/apt/sources.list.d/pour le garder propre, personnellement j'utilise stretch.list.

    Mettez ces lignes à l'intérieur:

    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
    
  • Configurez l' épinglage apt pour vous assurer de ne retirer que les packages Debian stretchdont vous spécifiez. Le fichier à utiliser pour cela est /etc/apt/preferences, à l'intérieur, mis:

    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
    

    (Vous devrez peut-être modifier les suites et les priorités en fonction de votre environnement.)

  • Exécutez apt-get update(via sudo/ as root) pour mettre à jour le cache du package.

  • Installez à nginxpartir de Debian stretch: apt-get install -t stretch nginx(faites ceci via sudo/ as root). Profit!

  • Comme je l'ai décrit dans mes commentaires, pour réduire encore plus les risques impliqués, vous pouvez utiliser quelque chose comme un chroot ou une solution de conteneur comme LXC . Au cas où vous voudriez aller dans ce chrootsens, vous devez mettre en place une interface réseau à l'intérieur: Pour ce faire, jetez un œil à ce blogpost par exemple , qui donne une introduction à network namespaces.

  • J'espère que cela t'aides; au cas où vous auriez plus de questions, n'hésitez pas à me contacter. J'apprécierais les commentaires et je suis intéressé par la façon dont cela se passe.

gf_
la source
J'ai installé nginx aujourd'hui par votre description de réponse et tout semble fonctionner très bien! La seule chose, je devais faire plus, était de supprimer l'ancienne installation de nginx, car j'avais nginx 1.10 du référentiel nginx et cette version n'est pas compatible avec le paquet des référentiels debian (mais je l'ai fait aussi lorsque je mettais à jour debian nginx à 1.10, donc ce n'était pas un problème). Merci pour vos efforts et votre aide!
Juraj Nemec
@JurajNemec Great! Merci beaucoup pour la rétroaction! Avez-vous ALPNdéjà vérifié le support?
gf_
Oui. Vérifié par le test http2 et le test SSL Labs , les deux états, qu'il existe un support ALPN. nginx -VDonne également des informations, que la version est compilée avec openssl 1.0.2+. Je pense donc que cela fonctionne correctement.
Juraj Nemec
@JurajNemec Super, ça sonne bien! Si possible pour vous, je serais intéressé à obtenir une petite mise à jour après avoir exécuté cette configuration pendant un certain temps, peut-être quatre ou huit semaines. Merci!
gf_
@JurajNemec Il semble que Google ait fait le changement et supprimé NPN. Votre configuration fonctionne-t-elle toujours comme prévu?
gf_
11

Une autre méthode consiste à installer OpenSSL 1.0.2 à partir de jessie-backports et à utiliser les builds Ubuntu 16.04 LTS à partir du propre référentiel de nginx. De cette façon, vous utilisez au moins un package OpenSSL conçu pour Jessie.

Ajouter à /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

Exécutez ensuite:

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

Cela vous met évidemment dans une configuration officiellement non prise en charge, mais c'est peut-être mieux que de ne pas avoir de package du tout - et cela a fonctionné pour moi. De plus, l'utilisation du dépôt de nginx signifie que vous obtenez de nouvelles mises à jour.

GreenReaper
la source
Pourriez-vous s'il vous plaît expliquer / clarifier pourquoi on irait dans cette voie? En ce qui concerne "Plus, l'utilisation du référentiel de nginx signifie que vous obtenez de nouvelles mises à jour.": Vous obtenez également des "nouvelles mises à jour" en utilisant la manière que j'ai décrite.
gf_
Les paquets de nginx sont mis à jour le même jour que leur publication, car ils font partie de leur processus de publication, et non du processus de publication de Debian. J'ai inclus les packages mainline, pas les packages stables, mais vous pouvez obtenir une stabilité en supprimant simplement / mainline dans les chemins ci-dessus. Ce que vous préférez dépend de vous.
GreenReaper
Pour développer ce qui précède: stretch est la version actuelle de «testing», et a donc un délai minimum en fonction du temps qu'il faut pour passer des tests ; et cela suppose qu'il le rend immédiatement instable - par exemple, 1.10.0 a été publié le 26 avril , mais poussé vers le 29 avril instable et migré pour s'étirer le 5 mai ( voir PTS ).
GreenReaper
1
Je suis bien conscient de ces faits, merci. :) Je pense que la question se résume à si l'on a besoin de "nouveaux packages" (juste parce que (?)) Si l'on essaie de fournir des services stables. AFAIK, beaucoup de gens choisissent Debian (et c'est l'OS dont il s'agit) car il est stable. Il existe un certain risque lié à l'exécution de nouvelles versions de logiciels. Mais de toute façon, je suppose qu'il n'y a pas de règle générale sur la façon de gérer cela, car les environnements, les attentes et les besoins diffèrent. En outre: Merci pour votre contribution, je suis sûr que cela a de la valeur pour les gens; mes lignes avant ne signifient aucune sorte d'infraction.
gf_
1
Comme vous le dites, c'est une question de degré. Si vous voulez être à la pointe du progrès, vous pouvez compiler des builds quotidiennement. Dans mon cas, étant au moins sur la principale technologie sage bord est un plus. ALPN lui-même n'est probablement pas un besoin pour la plupart des sites - mais il est hautement souhaité par ceux qui souhaitent utiliser HTTP / 2 (surtout si vous l'aviez précédemment en utilisant NPN); et ce groupe cible est également plus susceptible d'être intéressé par le type de fonctionnalités qui apparaissent dans nginx principal avant la stabilité. Je gère dix nœuds de cache et j'essaie généralement sur un plus petit pour tester sous charge avant de le déployer davantage.
GreenReaper
0

Une autre méthode consiste à utiliser jessie-backports puis à reconstruire facilement nginx

ajouter à /etc/apt/sources.list backports

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

puis exécutez en tant que root

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

puis reconstruisez nginx. Suivez les instructions sur https://wiki.debian.org/BuildingAPackage

StanleyD
la source
"[...] Soit vous compilez vous-même, ce que vous ne voulez pas faire [...]"
gf_
0

Pour moi, le moyen le plus simple de résoudre ce problème était d'utiliser une autre image Nginx Docker, voir la version officielle de Nginx sur Docker Hub . La version par défaut de Docker Nginx utilise Debian Jessie, ce qui ne résoudra pas votre problème, mais ils offrent également une version alternative basée sur Alpine Linux . Ses dernières versions utilisent OpenSSL 1.0.2!

Cette solution suppose donc que vous avez installé Docker et que Nginx fonctionne correctement au Alpine Linuxlieu de Debian Jessie.

Pour démarrer votre conteneur 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

Brève explication pour démarrer avec Docker:

  • docker run: télécharge l'image Docker (dans ce cas nginx:1.11-alpine) si vous ne l'avez pas encore et démarre un conteneur Docker basé sur cette image
  • --name nginx-container: donne un nom au conteneur Docker (vous pouvez afficher tous les conteneurs Docker en cours d'utilisation sudo docker psou utiliser sudo docker ps -apour afficher également les conteneurs arrêtés)
  • -p 80:80 -p 443:443: lie les ports 80 et 443 de votre machine hôte aux ports 80 et 443 respectivement dans le conteneur Docker
  • -v /path/to/your/nginx/directory/:/etc/nginx/: monte le répertoire sur votre système hôte qui contient votre configuration Nginx dans le /etc/nginx/répertoire du conteneur Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: monte un répertoire sur votre système hôte contenant les fichiers que Nginx doit servir
  • -d: démarre le conteneur en arrière-plan (vous pouvez arrêter l'utilisation du conteneur docker stop nginx-container)
  • nginx:1.11-alpine: utilisez cette image pour démarrer votre conteneur (les images officielles de Nginx Docker sont répertoriées ici )

Aussi utile:

  • utiliser sudo docker exec nginx-container <command>pour exécuter une commande dans le conteneur, par exemple sudo docker exec nginx-container nginx -s reloadpour recharger Nginx après avoir modifié les fichiers de configuration sur le système hôte
  • Ou utilisez sudo docker exec -it nginx-container bashpour entrer un shell bash dans le conteneur afin que vous puissiez y travailler directement (non recommandé, mais parfois utile)
Sicco
la source
0

Une autre solution consiste à utiliser BoringSSL à la place, ce qui ne nuit pas à l'environnement OpenSSL. Voici les détails auxquels se référer, https://www.admon.org/hardwares/enable-http2-support-for-nginx-on-debian-jessie

user402005
la source
1
Les réponses de lien uniquement ont tendance à devenir moins utiles après l'expiration des liens. Veuillez inclure une partie pertinente de la page liée dans votre réponse.
sendmoreinfo
0

Dans ma situation, j'ai utilisé le référentiel apt Dotdeb. Les instructions de ce site Web donnent la possibilité d'ajouter un référentiel qui vous permet d'installer Nginx avec un support HTTP2 «complet». La version actuelle est 1.14, ce qui est un mineur derrière la dernière version, vous ne serez donc pas trop loin (le backport actuel est 1.10).

HarmenB
la source