서버에서 ALPN을 지원하지 않는 이유는 무엇입니까?


11

현재 NGINX 1.11.9 및 openssl 1.0.2g를 사용하여 Ubuntu 16.04.1 LTS 서버를 실행하고 있습니다.

내가 읽은 모든 것에 따르면,이 버전은 ALPN을 지원해야하지만 KeyCDN의 HTTP / 2 테스트 도구 에서 테스트를 실행 하면 "ALPN이 지원되지 않습니다"라는 메시지가 나타납니다.keycdn 테스트 보고서의 화면 캡처

그리고를 실행 echo | openssl s_client -alpn h2 -connect example.com:443 | grep ALPN하면 다음과 같은 결과를 얻습니다.

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

ALPN을 활성화하지 않으면 HTTP2가 완전히 활성화되지 않습니다. ALPN을 어떻게 활성화합니까?

편집하다

nginx -V 보여줍니다 :

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'

편집 # 2

openssl version -a 산출:

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"

1
built with OpenSSL 1.0.1f— 그게 답인 것 같아요
Alexey Ten

nginx는 어디서 구했습니까? 아마도 공식 우분투 저장소에있는 것을 고수해야합니다. 1.10.0이 될 것입니다. 그러나 적어도 openssl의 올바른 버전에 대해 빌드 될 것입니다
Alexey Ten

NGINX는 호스트 인 Digitalocean에서 설치 한 Unbuntu 배포판과 함께 제공되었으며 이는 14.04에서 16.04로 수행 한 업그레이드 때문일 수도 있습니다. 어떻게 든이 문제를 해결하기 위해 NGINX를 다시 빌드 해야하는 것처럼 보입니다.
Godwin

의 결과를 추가 openssl version -a하여 OpenSSL이 예기치 않은 플래그 / 옵션으로 빌드되었는지 확인할 수 있습니까?
Castaglia

@Castaglia, 확실히, 나는 질문을 업데이트했다.
Godwin

답변:


11

@AlexyTen이 지적했듯이 근본 원인은 OpenSSL 1.0.2g를 설치했지만 NGINX를 OpenSSL로 빌드해야하고 ALPN을 지원하지 않는 1.0.1f로 빌드했기 때문입니다.

NGINX는 OpenSSL 1.0.2 이상으로 재 구축하고 다시 설치해야합니다. 온라인에서 몇 가지 자습서를 찾았지만 Digital Ocean 서버를 사용하고 있기 때문에이 도움말 항목을 사용하여 문제를 해결했습니다. https://www.digitalocean.com/community/questions/how-to-get-already- 설치 -nginx-to-use-openssl-1-0-2-for-alpn

먼저 몇 가지 새로운 라이브러리를 설치해야했습니다.

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

방금 다음 스크립트를 실행했습니다 : https://gist.github.com/AJMaxwell/f6793605068813aae888216b02364d85

사용하여 다시 시작 sudo shutdown -r now하고 nginx -V다시 실행 했습니다. 이번에는 나에게 주었다.

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

또한 keycdn의 http2 테스트를 다시 실행하여 통과했습니다.


2

Debian / Ubuntu, RHEL / CentOS 및 기타 배포판에서 OpenSSL을 사용하여 Nginx를 자동으로 다운로드하고 컴파일하고 설치하는 bash 스크립트를 만들었습니다. 결과 바이너리는 최신 버전의 OpenSSL과 함께 제공된다는 점을 제외하고 공식 저장소를 통해 Nginx를 배포하는 바이너리와 정확히 동일합니다.

스크립트는 OpenSSL 설치를 수정하지 않으며 Nginx 바이너리 만 수정합니다. 비공식 소스에서 빌드 및 배포 한 패키지에 의존하지 않으려는 경우 좋은 옵션입니다.

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


추적되지 않은 바이너리를 설치하는 대신 직접 빌드 한 패키지에 의존하지 않는 이유는 무엇입니까?
병아리

1
@chicks 바이너리가 아닌 Nginx를 빌드하는 스크립트입니다. 알 수없는 출처에서 바이너리를 다운로드하는 것은 위험 할 수 있으므로 만들었습니다.
빅터 디아즈

1

nginx ppa를 설치하면 ALPN을 지원합니다 :

sudo add-apt-repository ppa:nginx/stable
sudo apt update
sudo apt dist-upgrade -y

1
hda-me/nginx-stablebrotli 및 다이나믹 모듈을 실행할 수 있도록 개선
Jacob Evans
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.