Jak na serveru zapnout protokol TLS 1.3

18. 3. 2019 | Jindřich Zechmeister

V dnešním návodu se podíváme jak zapnout protokol TLS 1.3 na webovém serveru. Tento nejnovější protokol pro šifrovanou komunikaci má širokou podporu mezi moderními prohlížeči a není důvod ho již nevyužívat. Zvýšíte tím nejen bezpečnost návštěvníků, ale mírně též rychlost komunikace.

Podpora protokolu TLS 1.3 u webových serverů

Základním předpokladem zapnutí TLS 1.3 na serveru je softwarová podpora této verze protokolu. Tu je potřeba si ověřit před samotnými úpravami konfigurace. K datu vydání článku je podpora následující:

  • Linuxové servery spoléhající se na knihovnu OpenSSL protokol TLS 1.3 podporují. Podmínkou je OpenSSL verze 1.1.1.
    • Podpora přímo v distribuci - Debian 9 testing, Ubuntu 18.10.
  • Windows Server momentálně TLS 1.3 nepodporuje.

Podpora ze strany prohlížečů je vynikající u majoritních prohlížečů. Chrome a Firefox umí protokol TLS 1.3 už od roku 2017 a nyní už jejich výrobci používají finální verzi standardu, která je plně funkční. V podpoře absentuje Microsoft, který už vývoj svého prohlížeče vzdal, a zatím také Apple, který update pro Safari ještě nevydal.

Podpora TLS 1.3 v prohlížečíchPodpora TLS 1.3 v prohlížečích. Klikněte pro zvětšení.

Zapnutí TLS 1.3 na serveru s OpenSSL a Apache

Pro demonstraci si tedy vybíráme typický linuxový webový server. Pro ulehčení práce je vhodné, aby měla vaše distribuce použitá na serveru vyžadovanou verzi OpenSSL již v repozitářích, jinak nedoporučuji se do zapnutí pouštět (museli byste vyšší verzi zkompilovat a nainstalovat ručně). V příkladech vycházíme z distribuce Debian 9 (terminálové příkazy pro Ubuntu server by se neměly lišit, pro ostatní distribuce zvolte ekvivalent).

Zjištění verze OpenSSL na serveru

Pro zjištění verze OpenSSL zadejte do terminálu

openssl version

a hned uvidíte výsledek:

OpenSSL 1.1.1a 20 Nov 2018

Pokud je verze nižší než 1.1.1, tak je potřeba verzi upgradovat. Zdali je již dostupná pro vaši distribuci zjistíte rychle na distrowatch.com v detailu distribuce, kde je níže přehled známých balíků a jejich verze. Debian na testovacím serveru jsme museli pro účel testování TLS 1.3 přepnout na větev testing a pak upgradovat.

Apache musí být ve verzi 2.4.36 a vyšší; číslo verze balíku apache2 zjistíme stejným způsobem jako výše u openssl.

Je-li ověření verze OpenSSL pozitivní, můžeme přistoupit k nastavení Apache.

Nastavení Apache a vhostu

Apache má nastavení jednotlivých webů (domén) v samostatných souborech zvaných vhost. U Debianu je najdete v ceste /etc/apache2/sites-available/jmeno-domeny.conf.

Úpravou vhostu pro daný web (poznáte je podle jména) nastavujete jeho parametry a také přímo jeho zabezpečení, protože kromě protokolů jsou zde povoleny či zakázány konkrétní šifry.

Při předpokladu správné verze OpenSSL by měl Apache mít už povolen protokol TLS 1.3 ve výchozím stavu. My však úpravou direktivy SSLProtocol rovnou zakážeme zastaralé protokoly TLS 1.0 a 1.1:

SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

Pak bude Apache používat protokoly TLS 1.2 a 1.3, které jsou bezpečné. Upozorňuji, že nastavení protokolů musí být u všech vhostů stejné, jinak se změna patrně neprojeví. Nakonec restartujte Apache:

service apache2 restart

Celý konfigurační soubor apache2 s podporou PHP 7.3 (FPM) a HTTP/2 (klikněte pro zobrazení)

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
ProxyPassMatch ^/(.*.php(/.*)?)$ unix:/run/php/php7.3-fpm.sock|fcgi://localhost/var/www/server.cz/public_html

ServerAdmin webmaster@localhost
ServerName server.cz
ServerAlias www.server.cz
Protocols h2 h2c http/1.1
DocumentRoot /var/www/server.cz/public_html


Options FollowSymLinks
AllowOverride None


Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all


Options None
AllowOverride None
Require all granted
Order allow,deny
allow from all

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all

ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

SSLEngine on
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite
"EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:!DHE-RSA-AES256-SHA:!DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:CAMELLIA256-SHA:CAMELLIA128-SHA:DES-CBC3-SHA:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS"

SSLCertificateFile /etc/ssl/server/certifikat.pem
SSLCertificateKeyFile /etc/ssl/server/privatni.key
#SSLCertificateChainFile /etc/ssl/server/chain.pem

Zapnutí TLS 1.3 na Nginx

Nginx je velmi populární rival Apache a v počtu aktivních webů za ním příliš nezaostává. Proto je zahrnut do návodu taky. Konfigurace Nginx probíhá v souboru /etc/nginx/nginx.conf. Pro náš účel povolení TLS 1.3 potřebujeme minimálně verzi 1.13 a OpenSSL opět ve verzi 1.1.1 a novější (doporučuji spoléhat se na správce vaší distribuce a při nedostupnosti počkat na update balíků, jinak bude zřejmě nutná kompilace obou balíků ze zdrojového kódu).

Otevřete si konfigurační soubor a direktivu ssl_protocols doplňte o TLSv1.3 (příp. vložte, pokud chybí):

ssl_protocols TLSv1.2 TLSv1.3;

Do direktivy ssl_ciphers, která obsahuje seznam povolených šifer oddělených dvojtečkou, přidejte na začátek následující šifry pro TLS 1.3: TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256.

Pak otestujte konfiguraci příkazem:

nginx -t

Pokud test skončí úspěšně (test is successful), tak server podporuje TLS 1.3 a vše je v pořádku. Pokud dostanete odpověď invalid value "TLSv1.3", tak naopak Nginx protokol nepodporuje, nebo je problém v knihovně OpenSSL.

Celý konfigurační soubor nginx s podporou PHP a HTTP/2 (klikněte pro zobrazení) server {
listen 80 default_server;
listen [::]:80 default_server;

# SSL configuration
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/ssl/certifikat.pem;
ssl_certificate_key /etc/ssl/certifikat.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHAC$
ssl_prefer_server_ciphers on;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;

server_name server.cz;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

# pass PHP scripts to FastCGI server
#
location ~ .php$ {
include snippets/fastcgi-php.conf;

# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /.ht {
deny all;
}
}

Otestování výsledku

Zdali jste provedli správně a úspěšně zapnuli protokol TLS 1.3 na vašem webserveru snadno ověříte prakticky. Navštivte váš web v prohlížeči a najděte si detaily spojení; zde bude uveden i použitý TLS protokol.

Pokud chcete vidět výsledek testu "černý na bílém", tak můžete vyzkoušet jeden z mnoha nástrojů - například tento TLS checker, nebo detailní (ale pomalejší) test SSLlabs. Ten posoudí celkovou bezpečnost serveru, kterou kromě použitého protokolu určují i použité šifry (viz další odstavec).

Bonus: Nastavení šifer (ciphersuties)

Při kontrole konfigurace Apache doporučuji také zkontrolovat seznam používaných šifer. Ty jsou uvedeny v direktivě SSLCipherSuite.

Uživatelsky nejrychlejší způsob je otestování vašeho webu na SSLlabs.com a zhodnocení výsledků. Pokud bude mít test výhrady k použitým šifrám (ciphersuites), tak zastaralé ručně zakažte, nebo si nastavení šifer zkopírujte dle nástroje Mozilla SSL Configuration Generator nebo z cipherli.st.