Pourquoi ALPN n'est pas pris en charge par mon serveur?

11

J'utilise actuellement un serveur Ubuntu 16.04.1 LTS utilisant NGINX 1.11.9 et openssl 1.0.2g.

D'après tout ce que j'ai lu, ces versions devraient prendre en charge ALPN, mais lorsque je lance un test sur l'outil de test HTTP / 2 de KeyCDN , j'obtiens «ALPN n'est pas pris en charge»capture d'écran du rapport de test keycdn

Et quand j'exécute echo | openssl s_client -alpn h2 -connect example.com:443 | grep ALPN, j'obtiens:

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

Si ALPN n'est pas activé, HTTP2 n'est pas entièrement activé. Comment activer ALPN?

ÉDITER

nginx -V spectacles:

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'

EDIT # 2

openssl version -a production:

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
la source
1
built with OpenSSL 1.0.1f- suppose que c'est la réponse
Alexey Ten
Où avez-vous obtenu votre nginx? Vous devriez probablement vous en tenir à un qui est en dépôt officiel ubuntu. Ce serait 1.10.0, mais au moins il serait construit contre la bonne version de openssl
Alexey Ten
NGINX est venu avec la distribution Unbuntu que j'ai installée à partir de mon hôte, Digitalocean, il est également possible que cela soit dû à la mise à niveau que j'ai effectuée du 14.04 au 16.04. Il semble que je doive reconstruire NGINX d'une manière ou d'une autre pour résoudre ce problème.
Godwin
Pourriez-vous également ajouter la sortie de openssl version -a, afin que nous puissions voir si votre OpenSSL a été construit avec des indicateurs / options inattendus?
Castaglia
@Castaglia, bien sûr, j'ai mis à jour la question.
Godwin

Réponses:

11

Comme l'a souligné @AlexyTen, la cause principale était que, même si j'avais OpenSSL 1.0.2g installé, NGINX devait être construit avec OpenSSL et il a été construit avec 1.0.1f qui ne prend pas en charge ALPN.

NGINX doit être reconstruit avec OpenSSL 1.0.2 ou supérieur et réinstallé. J'ai trouvé quelques tutoriels en ligne mais parce que j'utilise un serveur Digital Ocean, j'ai utilisé cette rubrique d'aide pour résoudre le problème pour moi: https://www.digitalocean.com/community/questions/how-to-get-already- installé-nginx-à-utiliser-openssl-1-0-2-pour-alpn

J'ai d'abord dû installer quelques nouvelles bibliothèques:

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

J'ai ensuite simplement exécuté ce script: https://gist.github.com/AJMaxwell/f6793605068813aae888216b02364d85

J'ai recommencé à utiliser sudo shutdown -r nowet j'ai couru à nginx -Vnouveau. Cette fois, cela m'a donné:

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

J'ai également exécuté à nouveau le test http2 de keycdn et il a réussi.

Godwin
la source
2

J'ai créé un script bash qui télécharge, compile et installe automatiquement Nginx avec OpenSSL sur Debian / Ubuntu, RHEL / CentOS et d'autres distributions. Le binaire résultant est exactement le même que celui qui distribue Nginx via son référentiel officiel, sauf qu'il est livré avec la dernière version d'OpenSSL.

Le script ne modifie pas l'installation d'OpenSSL, seulement le binaire Nginx. C'est une bonne option si vous ne voulez pas compter sur des packages construits et distribués par des sources non officielles.

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

Víctor Díaz
la source
Pourquoi ne pas vous fier aux packages que vous créez vous-même au lieu d'installer des fichiers binaires non suivis?
poussins
1
@chicks C'est un script qui construit Nginx, pas un binaire. Le téléchargement de fichiers binaires à partir de sources inconnues peut être dangereux, c'est pourquoi je l'ai créé.
Víctor Díaz
1

Installez le nginx ppa et il prendra en charge ALPN:

sudo add-apt-repository ppa:nginx/stable
sudo apt update
sudo apt dist-upgrade -y
Nicolay77
la source
1
mieux avec hda-me/nginx-stablepour que vous puissiez exécuter brotli et des modules dynamiques
Jacob Evans