web-dev-qa-db-fra.com

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

J'exécute 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 quand je lance un test sur Outil de test HTTP/2 de KeyCDN , j'obtiens "ALPN n'est pas pris en charge" screen capture of keycdn test report

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

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

Ne pas activer ALPN désactive HTTP2 d'être entièrement activé. Comment activer ALPN?

[~ # ~] modifier [~ # ~]

nginx -V montre:

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"
11
Godwin

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-installed-nginx-to-use-openssl-1-0-2-for-alpn

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

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

Je viens alors d'exécuter ce script: https://Gist.github.com/AJMaxwell/f6793605068813aae888216b02364d85

J'ai redémarré en utilisant Sudo shutdown -r now et a couru nginx -V encore. 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.

11
Godwin

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

2
Víctor Díaz

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
1
Nicolay77