Debian jessie nginx con openssl 1.0.2 para usar ALPN en lugar de NPN

14

Estoy ejecutando debian jessie en mi servidor y recientemente me actualicé al nuevo servidor web nginx con soporte http / 2 (nginx 1.10). Como hoy, funciona muy bien y el servidor web está entregando contenido con el protocolo http2.

He leído que Chrome está dejando de admitir NPN y solo permite ALPN después del 15.5.2016. ALPN es una extensión, que requiere la instalación de openssl 1.0.2, pero en debian jessie solo es openssl 1.0.1 (también en los puertos de Debian y otros repositorios, no hay una versión de openssl 1.0.2 para este debian).

Y está el problema: he actualizado de SPDY a http2 y en unos días tendré que apagar http2 y no puedo usar SPDY porque esta versión de nignx solo tiene http2. También he leído que esta versión de debian se quedará con openssl 1.0.1 y solo debian stretch tendrá openssl 1.0.2. Pero para la fecha de lanzamiento hay casi un año y Chrome pronto dejará de ser compatible, por lo que no quiero perder el beneficio del protocolo http2.

¿Hay alguna solución, cómo instalar openssl 1.0.2 en este sistema, sin construir una compilación propia (mal mantenimiento) o esperar que el repositorio de backports lo tenga? Tampoco quiero dos versiones de openssl en mi sistema si una de ellas debe vincularse y mantenerse manualmente.

Gracias por cualquier ayuda.

Juraj Nemec
fuente
Podrías usar apt pinningy usar opensslfuera de Debian stretch.
gf_
@gf_ Con un riesgo muy alto de romper su sistema. Muchas cosas dependen de OpenSSL.
Michael Hampton
@MichaelHampton Bueno, no puedo juzgar sobre el nivel de riesgo, dudo que sea muy alto. Voy con Kurt Roeckx, uno de los mantenedores, que intentó conseguir 1.0.2en jessieapenas poco después de la congelación (que fue rechazada en aquel entonces.): "Esta versión debe ser compatible con la versión 1.0.1 no espero nada para romper el movimiento de 1.0.1 a 1.0.2 ". (Me gustaría ser más conscientes de libc6.)
gf_
@gf_ "Ponerlo en" en ese contexto requeriría recompilar todo lo que usa OpenSSL. No me sorprende que eso haya sido rechazado; A Debian le gusta lo viejo y lo estable. En el contexto de su sugerencia, significa también incorporar todos los paquetes de estiramiento que usan OpenSSL, y eso es un montón de cosas.
Michael Hampton
@MichaelHampton Soy bastante consciente de las políticas de Debian y tampoco me sorprende que esto haya sido rechazado en ese entonces (no quería decir esto ni crear esta impresión). Pero: (tal vez mi redacción es incorrecta): Hacer apt-get install -t stretch nginx(en una de vainilla Debian jessiecon nginxinstalada) se tire en: 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. (Estos son diez paquetes ...)
gf_

Respuestas:

16

Actualización 2016/08/08: nginx en jessie-backports(versión1.9.10-1~bpo8+3 se contra openssl >= 1.0.2~. ALPNTrabajar ahora si se ejecuta jessiesolo requiere la eliminación de los paquetes jessie-backports, ya no es necesario extraer los paquetes stretch.

-

Respuesta original: Bueno, aquí va mi respuesta, según los comentarios: en mi opinión, no hay muchas maneras de resolver esto a partir de hoy, 2016/05/09. Básicamente, debe intentar de alguna manera obtener una versión moderna de nginxsu sistema, compilada >= openssl 1.0.2~.

Las únicas dos opciones que veo actualmente: o compilas por ti mismo, lo que no quieres hacer, lo cual es bastante comprensible, o sacas paquetes modernos de Debian stretchtu sistema. Esto implica algunos riesgos, porque estás mezclando un entorno estable con otro, pero en mi opinión, estos riesgos son bastante bajos, porque lo estás usando Debian.

Entonces, vamos a probar esto:

  • Agregue el Debian stretchrepositorio a su apt sources. No lo use /etc/apt/sources.listpara esto, sino que use un archivo dedicado dentro /etc/apt/sources.list.d/para mantenerlo limpio, personalmente lo estoy usando stretch.list.

    Pon estas líneas adentro:

    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
    
  • Configure apt pinning para asegurarse de que solo extrae paquetes de los Debian stretchque está especificando. El archivo a utilizar para esto es/etc/apt/preferences , dentro, poner:

    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
    

    (Es posible que deba modificar las suites y las prioridades para adaptarse a su entorno).

  • Ejecutar apt-get update(vía sudo/ asroot ) para actualizar la caché del paquete.

  • Instalar nginxdesde Debian stretch: apt-get install -t stretch nginx(hacer esto a través de sudo/ as root). ¡Lucro!

  • Como describí en mi (s) comentario (s), para reducir aún más los riesgos involucrados, podría usar algo como un chroot o una solución de contenedor como LXC . En caso de que quiera seguir el chrootcamino, debe configurar una interfaz de red allí: para hacer esto, eche un vistazo a esta publicación de blog, por ejemplo , que le da una introducción network namespaces.

  • Espero que esto ayude; En caso de que tenga más preguntas, no dude en ponerse en contacto conmigo. Agradecería comentarios y estoy interesado en cómo va.

gf_
fuente
¡Instalé nginx hoy por su descripción de respuesta y todo parece funcionar muy bien! Lo único que necesitaba hacer más era eliminar la antigua instalación de nginx, porque tenía nginx 1.10 del repositorio nginx y esa versión no es compatible con el paquete de repositorios de Debian (pero lo hice también cuando estaba actualizando desde debian nginx a 1.10, por lo que no fue problema). ¡Gracias por tu esfuerzo y ayuda!
Juraj Nemec
@JurajNemec ¡Genial! Muchas gracias por los comentarios! ¿ ALPNYa buscó apoyo?
gf_
Si. Comprobado por la prueba http2 y la prueba SSL Labs , ambos estados, que hay soporte ALPN. También nginx -Vda información, que la versión está compilada con openssl 1.0.2+. Entonces creo que está funcionando correctamente.
Juraj Nemec
@JurajNemec ¡Genial, suena bien! Si es posible para usted, me interesaría recibir una pequeña actualización después de ejecutar esta configuración durante un tiempo, tal vez cuatro u ocho semanas. ¡Gracias!
gf_
@JurajNemec Parece que Google hizo el cambio y eliminó NPN. ¿Su configuración sigue funcionando como se esperaba?
gf_
11

Otro método es instalar OpenSSL 1.0.2 desde jessie-backports y usar las compilaciones Ubuntu 16.04 LTS desde el propio repositorio de nginx. De esa manera, al menos estás usando un paquete OpenSSL creado para Jessie.

Añadir 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

Entonces corre:

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

Obviamente, esto lo coloca en una configuración oficialmente incompatible, pero tal vez sea mejor que no tener un paquete, y funcionó para mí. Además, usar el repositorio de nginx significa que obtienes actualizaciones nuevas.

GreenReaper
fuente
¿Podría por favor elaborar / aclarar por qué uno iría por esta ruta? Con respecto a "Plus, usar el repositorio de nginx significa que obtienes actualizaciones nuevas": también obtienes "actualizaciones nuevas" usando la forma que he descrito.
gf_
Los paquetes de nginx se actualizan el mismo día de su lanzamiento, porque son parte de su proceso de lanzamiento, no del proceso de lanzamiento de Debian. Incluí los paquetes de línea principal, no los paquetes estables, pero puede obtener estabilidad simplemente eliminando / mainline en las rutas anteriores. Lo que prefieras depende de ti.
GreenReaper
Para ampliar lo anterior: el estiramiento es la versión actual de 'prueba' y, por lo tanto, tiene un retraso mínimo en función del tiempo que lleva pasar de la prueba ; y suponiendo que se convierta en inestable de inmediato, por ejemplo, 1.10.0 se lanzó el 26 de abril , pero se presionó a inestable el 29 de abril y migró para estirar el 5 de mayo ( ver PTS ).
GreenReaper
1
Soy bastante consciente de estos hechos, gracias. :) Creo que la pregunta se reduce a si uno necesita "paquetes nuevos" (solo porque (?)) Si intenta proporcionar servicios estables. AFAIK, muchas personas eligen Debian (y este es el sistema operativo del que trata la pregunta) porque es estable. Existe bastante riesgo al ejecutar nuevas versiones de software. Pero de todos modos, supongo que no hay una regla general sobre cómo se maneja esto, porque los entornos, las expectativas y las necesidades difieren. Además: gracias por su aporte, estoy seguro de que es valioso para las personas; mis líneas antes no significan ningún tipo de ofensa.
gf_
1
Como dices, es una cuestión de grado. Si quieres estar a la vanguardia, puedes compilar compilaciones diariamente. En mi caso, al menos en el líder en tecnología más avanzada en cuanto es un plus. ALPN en sí mismo probablemente no sea una necesidad para la mayoría de los sitios, pero es muy deseado por aquellos que desean usar HTTP / 2 (especialmente si lo había tenido anteriormente mientras usaba NPN); y es más probable que este grupo objetivo esté interesado en el tipo de características que aparecen en la línea principal nginx antes de estable. Administro diez nodos de caché, y normalmente lo pruebo en uno más pequeño para probar bajo carga antes de implementarlo más.
GreenReaper
0

Otro método es usar jessie-backports y luego reconstruir fácilmente nginx

agregar a /etc/apt/sources.list backports

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

y luego correr como root

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

y luego reconstruir nginx. Siga las instrucciones en https://wiki.debian.org/BuildingAPackage

StanleyD
fuente
"[...] O compilas por ti mismo, lo que no quieres hacer" [...]
gf_
0

Para mí, la forma más fácil de solucionar esto fue usar una imagen diferente de Nginx Docker, vea la versión oficial de Nginx en Docker Hub . La versión predeterminada de Docker Nginx usa Debian Jessie para que no solucione su problema, pero también ofrecen una versión alternativa basada en Alpine Linux . ¡Sus últimas versiones usan OpenSSL 1.0.2!

Por lo tanto, esta solución supone que instaló Docker y está bien con ejecutar Nginx en Alpine Linuxlugar de hacerlo Debian Jessie.

Para iniciar su contenedor 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 explicación para comenzar con Docker:

  • docker run: descarga la imagen de Docker (en este caso nginx:1.11-alpine) si aún no la tiene e inicia un contenedor de Docker basado en esta imagen
  • --name nginx-container: le da un nombre al contenedor Docker (puede ver todos los contenedores Docker en ejecución usando sudo docker pso sudo docker ps -atambién para ver los contenedores detenidos)
  • -p 80:80 -p 443:443: une los puertos 80 y 443 en su máquina host a los puertos 80 y 443 respectivamente en el contenedor Docker
  • -v /path/to/your/nginx/directory/:/etc/nginx/: monta el directorio en su sistema host que contiene su configuración de Nginx en el /etc/nginx/directorio en el contenedor Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: monta un directorio en su sistema host que contiene los archivos que desea que Nginx sirva
  • -d: inicia el contenedor en segundo plano (puede detener el contenedor usando docker stop nginx-container)
  • nginx:1.11-alpine: use esta imagen para iniciar su contenedor (las imágenes oficiales de Nginx Docker se enumeran aquí )

También útil:

  • use sudo docker exec nginx-container <command>para ejecutar un comando en el contenedor, por ejemplosudo docker exec nginx-container nginx -s reload para volver a cargar Nginx después de haber cambiado los archivos de configuración en el sistema host
  • O use sudo docker exec -it nginx-container bashpara ingresar un shell bash en el contenedor para que pueda trabajar allí directamente (no recomendado, pero a veces útil)
Sicco
fuente
0

En mi situación, he usado el repositorio apt de Dotdeb. Las instrucciones de este sitio web ofrecen la opción de agregar un repositorio que le permite instalar Nginx con soporte HTTP2 "completo". La versión actual es 1.14, que es una menor detrás de la última versión, por lo que no estará muy lejos (el backport actual es 1.10).

HarmenB
fuente