Einstieg HTTP/2.0 Ubuntu 16.04 nginx curl

HTTP/2.0 ist im Apache unter Ubuntu 16.04 noch nicht enthalten, ebenfalls lässt curl bzw. libcurl die HTTP/2.0 Unterstützung vermissen. Im nginx ist sie dagegen enthalten.

:~# apt-get install nginx
:~# nginx -v
nginx version: nginx/1.10.0 (Ubuntu)

:~# nginx -V
--with-http_v2_module

Für HTTP/2.0 ist ein SSL Zertifikat nötig. Für die schnellen ersten Schritte ist ein self-signed Zertifikat ausreichend.

:~# mkdir /etc/nginx/ssl
:~# cd /etc/nginx/ssl
:~# SERVER=localhost
:~# openssl genrsa -out $SERVER.nopasskey 2048
:~# chmod 600 $SERVER.nopasskey
:~# openssl req -new -key $SERVER.nopasskey -out $SERVER.csr
:~# openssl x509 -req -days 1825 -in $SERVER.csr -signkey $SERVER.nopasskey -out $SERVER.crt

Hier nur die nötigsten Änderungen der nginx Konfiguration.

:~# vim /etc/nginx/sites-available/default

        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        ssl_certificate /etc/nginx/ssl/localhost.crt;
        ssl_certificate_key /etc/nginx/ssl/localhost.nopasskey;

        server_name localhost;
:~# vim /etc/nginx/nginx.conf

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;
        ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        # die einschränkende ciphers list ist wichtig

:~# service nginx restart

Im Firefox mit eingeschalteten Web-Entwickler Werkzeugen und Abnicken aller Sicherheitswarnungen wegen dem eingesetzten self-signed Zertifikat, wird die Verbindung mit Version HTTP/2.0 angezeigt.

screenshot firefox http/2.0
screenshot firefox http/2.0

Trotz passender Version bringen curl bzw. libcurl unter Ubuntu 16.04 keinen HTTP/2.0 Support mit.

:~# curl -I -k --http2 https://localhost
curl: (1) Unsupported protocol

:~# curl --version
curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets

Der gleiche version Aufruf unter einem aktuellen Kali-Linux. Hier gibt es in curl bzw. libcurl die HTTP/2.0 Unterstützung.

:~# curl --version
curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.5.2 zlib/1.2.8 libidn/1.33 libssh2/1.7.0 nghttp2/1.13.0 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets

Der http2 Aufruf mit curl vom entfernten Kali-Linux über das Netzwerk.

:~# curl -I -k --http2 https://192.168.56.5
HTTP/2.0 200
server:nginx/1.10.0 (Ubuntu)
date:Mon, 08 Aug 2016 13:29:18 GMT
content-type:text/html
content-length:100
last-modified:Mon, 11 Jul 2016 10:18:45 GMT
etag:"57837285-64"
accept-ranges:bytes

Unter Ubuntu 16.04 steht nghttp zur Verfügung, mit dem HTTP/2.0 Verbindungen getestet werden können.

:~# apt-get install nghttp2-client

:~# nghttp -v https://localhost
[  0.000] Connected
The negotiated protocol: h2
[...]