Warum wird ALPN von meinem Server nicht unterstützt?

11

Ich verwende derzeit einen Ubuntu 16.04.1 LTS-Server mit NGINX 1.11.9 und openssl 1.0.2g.

Nach allem, was ich gelesen habe, sollten diese Versionen ALPN unterstützen. Wenn ich jedoch einen Test mit dem HTTP / 2-Testtool von KeyCDN durchführe , wird "ALPN wird nicht unterstützt" angezeigt.Screenshot des keycdn-Testberichts

Und wenn ich ausführe echo | openssl s_client -alpn h2 -connect example.com:443 | grep ALPN, bekomme ich:

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

Wenn ALPN nicht aktiviert ist, wird HTTP2 nicht vollständig aktiviert. Wie aktiviere ich ALPN?

BEARBEITEN

nginx -V zeigt an:

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 Ausgabe:

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
quelle
1
built with OpenSSL 1.0.1f- denke, das ist die Antwort
Alexey Ten
Woher hast du deinen Nginx? Wahrscheinlich sollten Sie sich an eine halten, die im offiziellen Ubuntu-Repo enthalten ist. Es wäre 1.10.0, aber zumindest würde es gegen die richtige Version von openssl gebaut
Alexey Ten
NGINX wurde mit der Unbuntu-Distribution geliefert, die ich von meinem Host Digitalocean installiert habe. Es ist auch möglich, dass dies auf das Upgrade zurückzuführen ist, das ich vom 14.04 auf 16.04 durchgeführt habe. Es sieht so aus, als müsste ich NGINX irgendwie neu erstellen, um dies zu lösen.
Godwin
Könnten Sie auch die Ausgabe von hinzufügen openssl version -a, damit wir sehen können, ob Ihre OpenSSL mit unerwarteten Flags / Optionen erstellt wurde?
Castaglia
@ Castaglia, sicher, ich habe die Frage aktualisiert.
Godwin

Antworten:

11

Wie @AlexyTen hervorhob, war die Hauptursache, dass NGINX, obwohl ich OpenSSL 1.0.2g installiert hatte, mit OpenSSL erstellt werden musste und mit 1.0.1f, das ALPN nicht unterstützt.

NGINX muss mit OpenSSL 1.0.2 oder höher neu erstellt und neu installiert werden. Ich habe einige Online-Tutorials gefunden, aber da ich einen Digital Ocean-Server verwende, habe ich dieses Hilfethema verwendet, um das Problem für mich zu lösen: https://www.digitalocean.com/community/questions/how-to-get-already- installiertes-nginx-to-use-openssl-1-0-2-for-alpn

Ich musste zuerst ein paar neue Bibliotheken installieren:

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

Ich habe dann gerade dieses Skript ausgeführt: https://gist.github.com/AJMaxwell/f6793605068813aae888216b02364d85

Ich habe mit neu gestartet sudo shutdown -r nowund bin wieder gelaufen nginx -V. Diesmal gab es mir:

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

Ich habe auch den http2-Test von keycdn erneut ausgeführt und er hat bestanden.

Godwin
quelle
2

Ich habe ein Bash-Skript erstellt, das Nginx mit OpenSSL unter Debian / Ubuntu, RHEL / CentOS und anderen Distributionen automatisch herunterlädt, kompiliert und installiert. Die resultierende Binärdatei ist genau die gleiche wie die, die Nginx über sein offizielles Repository verteilt, außer dass sie mit der neuesten Version von OpenSSL geliefert wird.

Das Skript ändert nicht die OpenSSL-Installation, sondern nur die Nginx-Binärdatei. Dies ist eine gute Option, wenn Sie sich nicht auf Pakete verlassen möchten, die von inoffiziellen Quellen erstellt und verteilt werden.

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

Víctor Díaz
quelle
Warum verlassen Sie sich nicht auf Pakete, die Sie selbst erstellen, anstatt nicht verfolgte Binärdateien zu installieren?
Küken
1
@chicks Es ist ein Skript, das Nginx erstellt, keine Binärdatei. Das Herunterladen von Binärdateien aus unbekannten Quellen kann gefährlich sein, daher habe ich sie erstellt.
Víctor Díaz
1

Installieren Sie das nginx ppa und es wird ALPN unterstützen:

sudo add-apt-repository ppa:nginx/stable
sudo apt update
sudo apt dist-upgrade -y
Nicolay77
quelle
1
Besser dran, hda-me/nginx-stabledamit Sie brotli und dynamische Module ausführen können
Jacob Evans