¿Por qué mi servidor no admite ALPN?

11

Actualmente estoy ejecutando un servidor Ubuntu 16.04.1 LTS usando NGINX 1.11.9 y openssl 1.0.2g.

De acuerdo con todo lo que he leído, estas versiones deberían ser compatibles con ALPN, sin embargo, cuando ejecuto una prueba en la herramienta de prueba HTTP / 2 de KeyCDN, obtengo "ALPN no es compatible"captura de pantalla del informe de prueba keycdn

Y cuando ejecuto echo | openssl s_client -alpn h2 -connect example.com:443 | grep ALPN, obtengo:

depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify return:1
depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
verify return:1
depth=0 OU = Domain Control Validated, OU = EssentialSSL Wildcard, CN = *.example.com
verify return:1
No ALPN negotiated
DONE

No tener ALPN habilitado deshabilita HTTP2 para que esté completamente habilitado. ¿Cómo habilito ALPN?

EDITAR

nginx -V muestra:

nginx version: nginx/1.11.9
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
built with OpenSSL 1.0.1f 6 Jan 2014 (running with OpenSSL 1.0.2g  1 Mar 2016)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

EDITAR # 2

openssl version -a salida:

OpenSSL 1.0.2h  3 May 2016
built on: reproducible build, date unspecified
platform: linux-x86_64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -I. -I.. -I../include  -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/usr/local/ssl"
Godwin
fuente
1
built with OpenSSL 1.0.1f- Supongo que esa es la respuesta
Alexey Ten
¿De dónde sacaste tu nginx? Probablemente deberías quedarte con uno que esté en el repositorio oficial de ubuntu. Sería 1.10.0, pero al menos se construiría contra la versión correcta de openssl
Alexey Ten
NGINX vino con la distribución de Unbuntu que instalé desde mi host, Digitalocean, también es posible que esto se deba a la actualización que realicé de 14.04 a 16.04. Parece que necesito reconstruir NGINX de alguna manera para resolver esto.
Godwin
¿Podría agregar también la salida de openssl version -a, para que podamos ver si su OpenSSL se creó con alguna opción / indicador inesperado?
Castaglia
@Castaglia, claro, actualicé la pregunta.
Godwin

Respuestas:

11

Como señaló @AlexyTen, la causa raíz fue que, aunque tenía instalado OpenSSL 1.0.2g, NGINX necesitaba ser construido con OpenSSL y fue construido con 1.0.1f que no es compatible con ALPN.

NGINX necesita ser reconstruido con OpenSSL 1.0.2 o superior y reinstalado. Encontré algunos tutoriales en línea, pero debido a que estoy usando un servidor Digital Ocean, utilicé este tema de ayuda para resolver el problema: https://www.digitalocean.com/community/questions/how-to-get-already- instalado-nginx-to-use-openssl-1-0-2-for-alpn

Primero necesitaba instalar algunas bibliotecas nuevas:

apt-get install libgeoip-dev libgd2-xpm-dev libperl-dev

Luego acabo de ejecutar este script: https://gist.github.com/AJMaxwell/f6793605068813aae888216b02364d85

Reinicié usando sudo shutdown -r nowy corrí de nginx -Vnuevo. Esta vez me dio:

nginx version: nginx/1.11.0
built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
built with OpenSSL 1.0.2h  3 May 2016
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-openssl=/root/openssl-1.0.2h --add-module=/root/ngx_pagespeed-release-1.11.33.2-beta

También ejecuté la prueba http2 de keycdn nuevamente y pasó.

Godwin
fuente
2

He creado un script bash que descarga, compila e instala automáticamente Nginx con OpenSSL en Debian / Ubuntu, RHEL / CentOS y otras distribuciones. El binario resultante es exactamente el mismo que distribuye Nginx a través de su repositorio oficial, excepto que viene con la última versión de OpenSSL.

El script no modifica la instalación de OpenSSL, solo el binario Nginx. Es una buena opción si no desea confiar en paquetes construidos y distribuidos por fuentes no oficiales.

https://github.com/victordzmr/nginx-compiler

Víctor Díaz
fuente
¿Por qué no confiar en los paquetes que construye usted mismo en lugar de instalar binarios sin seguimiento?
pollitos
1
@chicks Es un script que construye Nginx, no un binario. Descargar binarios de fuentes desconocidas puede ser peligroso, por lo tanto, lo he creado.
Víctor Díaz
1

Instale el nginx ppa y será compatible con ALPN:

sudo add-apt-repository ppa:nginx/stable
sudo apt update
sudo apt dist-upgrade -y
Nicolay77
fuente
1
mejor hda-me/nginx-stablepara poder ejecutar brotli y módulos dinámicos
Jacob Evans