Mengapa ALPN tidak didukung oleh server saya?

11

Saya saat ini menjalankan server Ubuntu 16.04.1 LTS menggunakan NGINX 1.11.9 dan openssl 1.0.2g.

Menurut semua yang saya baca, versi ini harus mendukung ALPN, namun ketika saya menjalankan tes pada alat HTTP / 2 Test KeyCDN, saya mendapatkan "ALPN tidak didukung"tangkapan layar laporan uji keycdn

Dan ketika saya mengeksekusi echo | openssl s_client -alpn h2 -connect example.com:443 | grep ALPN, saya mendapatkan:

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

Tidak mengaktifkan ALPN menonaktifkan HTTP2 agar tidak sepenuhnya diaktifkan. Bagaimana cara saya mengaktifkan ALPN?

EDIT

nginx -V menunjukkan:

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

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
sumber
1
built with OpenSSL 1.0.1f- tebak itulah jawabannya
Alexey Ten
Di mana Anda mendapatkan nginx Anda? Mungkin Anda harus tetap dengan yang ada di repo ubuntu resmi. Itu akan menjadi 1.10.0, tetapi setidaknya itu akan dibangun melawan versi openssl yang tepat
Alexey Ten
NGINX datang dengan distro Unbuntu yang saya instal dari host saya, Digitalocean, mungkin juga karena upgrade yang saya lakukan dari 14,04 menjadi 16,04. Sepertinya saya perlu membangun kembali NGINX untuk menyelesaikannya.
Godwin
Bisakah Anda juga menambahkan output openssl version -a, sehingga kami dapat melihat apakah OpenSSL Anda dibuat dengan flag / opsi yang tidak terduga?
Castaglia
@Castaglia, tentu, saya memperbarui pertanyaan.
Godwin

Jawaban:

11

Seperti yang ditunjukkan oleh @AlexyTen, akar penyebabnya adalah, walaupun saya telah menginstal OpenSSL 1.0.2g, NGINX perlu dibangun dengan OpenSSL dan dibangun dengan 1.0.1f yang tidak mendukung ALPN.

NGINX perlu dibangun kembali dengan OpenSSL 1.0.2 atau lebih baru dan diinstal ulang. Saya menemukan beberapa tutorial online tetapi karena saya menggunakan server Digital Ocean, saya menggunakan topik bantuan ini untuk menyelesaikan masalah bagi saya: https://www.digitalocean.com/community/questions/how-to-get-already- diinstal-nginx-untuk-menggunakan-openssl-1-0-2-untuk-alpn

Saya pertama kali perlu menginstal beberapa perpustakaan baru:

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

Saya kemudian menjalankan skrip ini: https://gist.github.com/AJMaxwell/f6793605068813aae888216b02364d85

Saya memulai kembali menggunakan sudo shutdown -r nowdan berlari nginx -Vlagi. Kali ini memberi saya:

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

Saya juga menjalankan tes http2 keycdn lagi dan itu berlalu.

Godwin
sumber
2

Saya telah membuat skrip bash yang secara otomatis mengunduh, mengkompilasi dan menginstal Nginx dengan OpenSSL di Debian / Ubuntu, RHEL / CentOS dan distro lainnya. Biner yang dihasilkan persis sama dengan biner yang mendistribusikan Nginx melalui repositori resminya kecuali ia hadir dengan OpenSSL versi terbaru.

Script tidak mengubah instalasi OpenSSL, hanya biner Nginx. Ini adalah pilihan yang baik jika Anda tidak ingin bergantung pada paket yang dibuat dan didistribusikan oleh sumber tidak resmi.

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

Víctor Díaz
sumber
Mengapa tidak mengandalkan paket yang Anda buat sendiri alih-alih memasang binari yang tidak terlacak?
anak ayam
1
@chicks Ini adalah skrip yang membangun Nginx, bukan biner. Mengunduh binari dari sumber yang tidak dikenal mungkin berbahaya, karenanya saya membuatnya.
Víctor Díaz
1

Instal nginx ppa dan itu akan mendukung ALPN:

sudo add-apt-repository ppa:nginx/stable
sudo apt update
sudo apt dist-upgrade -y
Nicolay77
sumber
1
lebih baik dengan hda-me/nginx-stablesehingga Anda dapat menjalankan modul brotli dan dinamis
Jacob Evans