Mark Koek

SSL/TLS configureren met sterke cryptografie

De meeste vulnerability scans en pentests leveren wel bevindingen op met betrekking tot SSL (TLS). Want cryptografie is complex en de eisen veranderen snel. Maar hoe richt u uw server zo in dat er in elk geval geen verouderde versies of zwakke versleuteling draaien? En wat is een redelijk compromis om geen bezoekers met iets oudere browsers te verliezen?

Op deze pagina willen we een overzicht geven van diverse typen serversoftware en hoe daarop TLS (SSL) op een veilige manier te configureren.

Algemeen

Versleuteling van verbindingen op het internet is sterk aan veranderingen onderhevig. Er worden voortdurend nieuwe kwetsbaarheden ontdekt die in meer of mindere mate praktisch een probleem zijn. Ook stelt de toenemende rekenkracht van computers nieuwe uitdagingen: wat 10 jaar geleden nog als redelijk sterke versleuteling kon worden beschouwd is nu niet meer voldoende omdat moderne computers op hoge snelheid sleutels kunnen uitproberen.

Omdat in veel situaties oudere versies van browsers, mailprogramma’s en andere afnemers” van versleutelde verbindingen moeten worden ondersteund kunt u er misschien niet altijd vanuit gaan dat de nieuwste en beste versleutelingsmethoden en ‑protocollen kunnen worden geboden. Daarom proberen we op deze pagina twee varianten van ons advies aan te houden:

  1. topkwaliteit: u controleert de clients die verbinden met uw server en u hoeft geen rekening te houden met verouderde clients. Dit gaat veelal over interne web- en mailservers die alleen bezocht worden met de laatste versie van een moderne browser of mailprogramma omdat u op de werkplekken altijd de laatste updates installeert.
  2. compromiskwaliteit: u wilt graag goede versleuteling van het verkeer, maar u wilt geen bezoekers weren die een iets oudere browser hebben (bijvoorbeeld telefoons met een oudere Android-versie).

Bij de compromiskwaliteit gaan we ervan uit dat bezoekers minimaal de volgende softwareversies hebben:

  • Mozilla Firefox 27
  • Google Chrome 31
  • Microsoft Edge 12 of Internet Exporer 11 (Windows 7)
  • Android 4.4.2
  • Apple Safari /IOS 9
  • Java-applicaties minimaal op Java 8
  • Opera 20

Apache HTTPD

De beste configuratie is om uitsluitend TLS 1.3 te ondersteunen. Let op dat dit alleen werkt met volledig up-to-date clients.

De topkwaliteit-configuratie is eenvoudig:

SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2

De server ondersteunt dan alleen de nieuwste versie van TLS (1.3) waarbinnen alle versleutelingsmethoden op dit moment als zeer sterk kunnen worden beschouwd. Check wel dat uw serversoftware voldoende recent is, zodanig dat TLS 1.3 wel ondersteund wordt. U heeft hiervoor tenminste Apache-versie 2.4.39 met OpenSSL-versie 1.1.1 nodig.

Wilt u toch iets oudere clients ondersteunen dan bevelen we (in compromiskwaliteit) de volgende configuratie aan:

SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384

U ondersteunt dan alleen TLS 1.2 en 1.3 met sterke versleutelingsmethoden.

Bovenstaande regels moeten worden opgenomen in uw Apache-configuratie. Hoe deze is ingedeeld kan per systeem verschillen. In het algemeen zal deze zich bevinden in /etc/httpd/ of /etc/apache2/. In deze mappen is vaak een submap met configuratiebestanden te vinden, meestal met de naam conf.d/. Daarin vindt u een bestand met een naam als 10-ssl.conf waarin u bovenstaande regels kunt toevoegen of aanpassen. Na een herstart van de Apache-service is de nieuwe configuratie actief.

Microsoft Internet Information Server (IIS)
Microsoft Exchange
Microsoft Remote Desktop Services (Terminal Services)

Microsoft-servers ondersteunen versie 1.3 van TLS nog niet, dus de topkwaliteit-configuratie is op IIS, Exchange of andere serverproducten van Microsoft niet in te stellen, zelfs niet op Windows Server 2019.

Om de best mogelijke configuratie op IIS, Exchange en Remote Desktop te verkrijgen is het nodig om een aantal wijzigingen te doen in de Registry. Onder de volgende entries maakt u een subkey aan met de naam Enabled en de waarde 0:

HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server

Onder de volgende Registry key maakt u vervolgens een subkey Enabled aan met de waarde 1:

HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server

De server zal nu alleen nog HTTPS via TLS 1.2 aanbieden waarmee u vele kwetsbaarheden in de versleuteling voorkomt.

We willen de configuratie echter nog iets aanscherpen omdat ook onder TLS 1.2 een aantal versleutelingsmethoden worden aangeboden die niet allemaal even sterk zijn. Ook in de compromiskwaliteit (zie boven) kunnen we er een aantal uitschakelen. Met name methoden die Cipher Block Chaining (CBC) gebruiken willen we uitschakelen.

U kunt met het volgende PowerShell-commando opvragen welke algoritmen met CBC gebruikt worden door de server:

Get-TlsCipherSuite -Name "CBC"

Voor alle resultaten van dit commando kunt u het de versleutelingsmethode uitschakelen met:

Disable-TlsCipherSuite -Name "TLS_RSA_WITH_3DES_EDE_CBC_SHA"

Herhaal dit voor elke methode die u wilt uitschakelen, waarbij u in bovenstaand commando tussen de aanhalingstekens de betreffende naam invult.

nginx

Als u de webserver nginx gebruikt kunt u de SSL-/TLS-instellingen aanpassen in het configuratiebestand /etc/nginx/nginx.conf.

Voor topkwaliteit HTTPS schakelt u alleen TLS 1.3 in met de volgende configuratie-optie:

ssl_protocols TLSv1.3;

Voor compromiskwaliteit gebruikt u de volgende instellingen:

ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

lighttpd

Voor de eenvoudige webserver lighttpd kunt u in het configuratiebestand /etc/lighttpd/lighttpd.conf het volgende opnemen:

ssl.openssl.ssl-conf-cmd = ("Protocol" => "ALL, -SSLv2, -SSLv3, -TLSv1, -TLSv1.1, -TLSv1.2") ssl.cipher-list = ""

(dit is de topkwaliteit-configuratie met alleen TLS 1.3 — let op dat uw versie van Lighttpd wel TLS 1.3 ondersteunt (minimaal versie 1.4.53 met OpenSSL 1.1.1), anders schakelt u alle SSL en TLS uit)

Voor de compromiskwaliteit kunt u de volgende regels toevoegen:

ssl.openssl.ssl-conf-cmd = ("Protocol" => "ALL, -SSLv2, -SSLv3, -TLSv1, -TLSv1.1") ssl.cipher-list = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"

Postfix (SMTP)

Ook e‑mail kan (en moet) over TLS verzonden worden, en ook hierbij heeft u met uitdagingen te maken over versie van het protocol en versleutelingsalgoritmen. We beschrijven hier hoe u SSL/TLS correct configureert op de veelgebruikte mail transfer agent Postfix.

Voor topkwaliteit (let op: gebruik dit uitsluitend om te communiceren met mailservers waarvan u zeker weet dat ze ook TLS 1.3 ondersteunen, anders wordt de mail onversleuteld verzonden!) stelt u het volgende in in /etc/postfix/main.cf:

smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2 smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2 tls_preempt_cipherlist = no

Voor compromiskwaliteit stelt u Postfix als volgt in:

smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 smtpd_tls_mandatory_ciphers = medium tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 tls_preempt_cipherlist = no

Ook hier geldt dat e‑mail anders is dan web browsing: als de TLS-verbinding niet tot stand kan komen dan zal het mailverkeer (tenzij anders ingesteld, maar dat is zelden het geval) terugvallen op ouderwets onversleuteld verzenden van de e‑mail. Ook niet zo goede versleuteling is dan toch te prefereren, omdat het toch beter is dan niets. Daarom geven we hier ook een instelling die compatibel is met ook zeer oude servers op het internet:

smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3 smtpd_tls_protocols = !SSLv2, !SSLv3 smtpd_tls_mandatory_ciphers = medium tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA tls_preempt_cipherlist = yes

Overig

We zullen op deze plaats serversoftware toevoegen zodra we het in de praktijk tegenkomen.