Pokud na webovém serveru zapneme využití šifrování SSL/TLS, tak můžeme konfigurovat různé parametry. Většinou máme možnost omezit použité šifry, tak můžeme zakázat slabé šifry, a nastavovat jejich pořadí, abychom preferovali Forward Secrecy. Ve výchozím nastavení jsou většinou povolené všechny. Podíváme se na nastavení nejrozšířenějších webových/aplikačních serverů.
Apache HTTP Server
Webový server Apache využívá pro SSL/TLS knihovnu OpenSSL. Z toho plynou výhody i nevýhody. Pokud je v této knihovně nějaká zranitelnost (jako v poslední době Heartbleed bug a další), tak je zranitelný i tento server. Obecně je dobré používat nejnovější verzi OpenSSL a také Apache serveru, protože například podpora eliptických křivek (a tedy ECDHE, který je doporučovaný kvůli vlastnosti Forward Secrecy) je až od verze Apache 2.3.3, v této verzi byla také přidána podpora OCSP Stapling (která se doporučuje využívat). Od verze Apache 2.4.7 se provádí automatické nastavení Diffie-Hellman parametrů (dříve se vždy použilo 1024 bitů). Pro využití protokolu TLSv1.1 a TLSv1.2 je potřeba OpenSSL minimálně verze 1.0.1.
Pozn.: V souvislosti s útokem POODLE byl do OpenSSL 1.0.1j zapracován automaticky podporovaný bezpečnostní prvek TLS_FALLBACK_SCSV
.
OpenSSL také obsahuje nástroje pro práci s certifikáty, jako je vystavení žádosti (a privátního klíče), vytvoření self-signed certifikátu, převody formátů, kontroly či odstranění hesla (passphrase) z privátního klíče.
Konfigurace Apache
Apache využívá modul mod_ssl
a konfigurace se provádí pomocí direktiv většinou v hlavním konfiguračním souboru (httpd-ssl.conf
či httpd.conf
). Direktivy se zadávají převážně do části server config nebo virtual host. Oficiální dokumentace Apache Module mod_ssl.
Některé z používaných direktiv:
SSLEngine
- zapnutí SSL/TLSSSLCompression
- dovoluje zapnout kompresi, není doporučováno, protože umožňuje útok CRIME, příkaz je dostupný až od verze 2.2.24, ve verzích 2.2.24 a 2.2.25 byla default hodnota on a teprve poté offSSLHonorCipherOrder
- normálně se na výběr šifry používá preference klienta, takto můžeme použít preferenci serveruSSLProtocol
- povolené protokolySSLCipherSuite
- povolené šifry, zadává se seznam oddělený dvojtečkou, využívají se předpony + pro přidání na dané místo seznamu, - odebrání, ! kompletní odebrání (nemůže se jiným způsobem přidat), bez předpony znamená přidání do seznamuSSLRequireSSL
- vynucení použití SSLSSLVerifyClient
- ověření klienta pomocí certifikátuSSLCertificateFile
- PEM-encoded (Base64) X.509 certifikát serveru (textový formát začínající -----BEGIN CERTIFICATE-----), přípona pem, cer, crt, certifikát může být včetně privátního klíče, pokud chceme využívat více šifer (autentizace), tak můžeme použít paralelně více certifikátů různých typů (RSA, DSA, eliptické křivky ECC - ECDSA)SSLCertificateKeyFile
- PEM-encoded privátní klíč k certifikátu serveru, přípona keySSLCertificateChainFile
- jeden soubor, který může obsahovat více PEM-encoded certifikátů autorit spojených dohromady (umístěných za sebe do souboru), první je certifikát autority, která vydala serverový certifikát, dále se může pokračovat v řetězu až ke kořenové autoritě, tyto certifikáty pak server posílá prohlížeči spolu se serverovým certifikátem, přípona pem, cer, crtSSLCACertificateFile
- certifikát CA (nebo více v jednom souboru) pro ověření klientských certifikátů
Příklad konfigurace SSL s optimalizovanými šiframi (jsou vypnuty slabé a nebezpečné a určeno pořadí)
SSLEngine on SSLCompression off SSLHonorCipherOrder on SSLProtocol All -SSLv2 -SSLv3 SSLCipherSuite EECDH+AES:EDH+AES:EDH+CAMELLIA:EECDH+3DES:EDH+3DES:RSA+AES:RSA+CAMELLIA:RSA+3DES SSLCertificateFile /path/to/certificate SSLCertificateKeyFile /path/to/private/key SSLCertificateChainFile /path/to/CA_certificates
Pozn.: Zapnutí SSL a soubor s certifikátem bychom patrně umístili do části VirtualHost, ostatní do hlavní části. V novějších verzích Apache je již SSLv2 úplně nepodporováno a není součástí All. Změny se projeví po restartu serveru (nebo načtení konfigurace).
Volba protokolů a šifer
Důležité a složité je zvolit vhodný soubor šifer v direktivě SSLCipherSuite
a použité protokoly v SSLProtocol
. Možností je mnoho a asi žádná není ideální. Protokol SSL 2 určitě zapínat nebudeme a dobré je vypnout i SSL 3, to by mělo ovlivnit pouze Internet Explorer 6 v defaultním stavu (v konfiguraci můžeme podporu TLS 1.0 zapnout).
Pokud podporujeme TLS 1.0 (což asi ano), tak se musíme rozhodnout, jestli využít slabou šifru RC4 nebo ji zakázat a být zranitelní útokem BEAST (ten se dnes bere jako menší zlo). Podobně pro nejstarší klienty na Win XP (pokud je chceme podporovat), zda využijeme RC4 nebo 3DES.
Dále je dobré seřadit seznam tak, aby na začátku byly šifry podporující Perfect Forward Secrecy. Na internetu najdeme mnoho příkladů nastavení, většinou využívají RC4, ale nejnovější diskuze se kloní k jeho nepoužívání.
Pozn.: Pokud máme certifikát RSA, tak autentizace bude RSA a nebude se nabízet ECDSA nebo DSS, i když je máme nastavené.
Šifry můžeme zadávat přesným výčtem, výčtem skupin nebo třeba povolit vše a vyjmenovat zakázané typy. Zdálo by se mi vhodnější povolit soubor šifer a vyjmenovat zakázané, protože pokud by se v budoucnu doplnila nová šifra, tak bychom ji automaticky podporovali. Ale často je jednodušší vyjmenovat povolené, hlavně protože chceme určit jejich pořadí. Některé další příklady výčtu šifer jsou níže, první varianta je odolná proti BEAST a POODLE při použití SSL 3 (využívá RC4).
SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!SEED SSLCipherSuite ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH SSLCipherSuite TLSv1.2:RC4:HIGH:!aNULL:!eNULL:!MD5 SSLCipherSuite ALL:!EXP:!NULL:!LOW:!SSLv2:!RC2:!RC4:!DES:!IDEA:!SEED:!aNULL:!ADH:!PSK:!MD5:+HIGH:+MEDIUM
Apache Tomcat
Aplikační server Tomcat využívá dvě různé implementace SSL. APR (Apache Portable Runtime) implementaci, která standardně využívá knihovny OpenSSL, nebo JSSE (Jave Secure Socket Extensions) implementaci, což je součást Java runtime. Jaké budeme mít k dispozici protokoly a šifry závisí na použitých knihovnách a jejich verzích. V současnosti je patrně APR s nejnovější verzí OpenSSL lepší volba.
Oficiální dokumentaci (pro Tomcat 7) nalezneme v článcích Apache Tomcat 7 - SSL Configuration HOW-TO, Apache Tomcat 7 - The HTTP Connector.
Pozn.: Úvahy nad protokoly a šiframi jsme si popsali v minulém článku a také u Apache HTTP Server.
Konfigurace SSL/TLS pro Tomcat se provádí v souboru server.xml
. Co se týká SSL/TLS tak jde převážně o element Connector
, kam zadáváme různé atributy. Zda se použije implementace APR nebo JSSE se volí automaticky podle instalace Tomcatu (pro APR musíme mít speciální) nebo můžeme definovat ručně atributem protocol
.
HTTP/1.1
- použije automatickou volbuorg.apache.coyote.http11.Http11Protocol
- blocking Java connector (BIO JSSE)org.apache.coyote.http11.Http11NioProtocol
- non blocking Java connector (NIO JSSE)org.apache.coyote.http11.Http11AprProtocol
- APR connector (knihovna musí být dostupná)
Několik dalších atributů je společných pro obě implementace, ty hlavní jsou:
port
- TCP port, kde se vytvoří server socket pro příchozí spojeníprotocol
- použitý protokol, viz. výšeSSLEnabled
- zapnutí SSL/TLS na konektoruscheme
- jméno protokolu pro aplikacisecure
- informace o SSL pro aplikaci
Další atributy pro konfiguraci SSL jsou rozdílné pro JSSE nebo APR, také se liší formát certifikátů. Po úpravě konfigurace je třeba restartovat server.
JSSE SSL - nativní Java BIO, NIO
V tomto případě záleží na tom, jakou Javu používáme, například OpenJDK je na tom s podporou šifer hůře, než Oracle JDK. Navíc můžeme použít jinou krypto implementaci (umístěním JAR souboru do složky ext a nastavením provider seznamu v souboru java.security), například Bouncy Castle, která je lepší. Oracle Java podporuje TLS 1.2 až od verze 7.
Tomcat (Java) využívá soubor keystore, kam se ukládají certifikáty a privátní klíče pro server. Pro práci s tímto souborem můžeme použít nástroje OpenSSL, ale spíše se využívá keytool
, který je součástí JRE (Java Runtime Environment). Keystore může být ve formátu JKS (Java KeyStore), tedy standardní Java formát obsluhovaný nástrojem keytool
, PKCS11 a PKCS12 (Public-Key Cryptography Standards #12). PKCS12 je internetový standard, standardně používá přípony p12
nebo pfx
, je využíván ve Windows a pracovat s ním umí třeba OpenSSL. Pokud použijeme jiný formát než JKS, tak musíme určit v konfiguraci keystoreType="PKCS12"
.
Používané atributy
sslProtocol
- jedna hodnota určující povolené protokolysslEnabledProtocols
- seznam povolených protokolů oddělených čárkou (používá se od Tomcat 6.0.38, ve starších verzích slouží stejněsslProtocols
)ciphers
- seznam povolených šifer oddělených čárkou (hodnota ALL povolí všechny)keystoreFile
- keystore souborkeystoreType
- typ keystorukeystorePass
- heslo ke keystoruclientAuth
- klientská autentizace certifikátem
Názvy šifer a protokolů, jak je využívá Java, nalezneme v dokumentaci Java Cryptography Architecture Standard Algorithm Name Documentation. Pravidla jsou podobná, jako jsme popsali dříve. Navíc Java (patrně do verze 8) používá pro DHE klíče o velikosti 768 bitů, které nejsou bezpečné (Java 8 by toto měla řešit), takže se doporučuje použít pouze ECDHE. Nemůžeme určit pořadí šifer, takže nemůžeme preferovat Forward Secrecy, toto je podporováno od Tomcat 8 s Java 8.
Java má standardně omezení na silné šifry, pokud chceme využít 256 bit AES (a ne pouze 128 bit), tak musíme stáhnout a nainstalovat (zkopírovat dva malé soubory do složky JDK/JRE) JCE Unlimited Strength Jurisdiction Policy Files.
Příklad konfigurace
<Connector protocol="org.apache.coyote.http11.Http11Protocol" port="8443" SSLEnabled="true" scheme="https" secure="true" sslProtocol="TLS" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA" clientAuth="false" keystoreFile="/path/to/PKCS12certificate" keystoreType="PKCS12" keystorePass="passw" maxThreads="200" acceptCount="100" />
APR - OpenSSL
Když používáme knihovnu OpenSSL, tak je vše podobné, jak jsme si popsali pro Apache HTTP Server (potřebná verze 1.0.1, aby podporovala TLSv1.1 a TLSv1.2, způsob konfigurace, atd.). V současnosti je využití OpenSSL lepší než JSSE, protože podporuje novější šifry. Zde si uvádíme pouze hlavní atributy.
SSLProtocol
- povolené protokoly, v současnosti můžeme použít pouze klíčová slova ALL, SSLv2, SSLv3 a TLSv1 a jejich kombinaci se znakem plus, zápis ALL je stejný jako SSLv3+TLSv1 a povolí SSL 3, TLS 1.0, TLS 1.1, TLS 1.2, pokud použijeme TLSv1, tak dostaneme pouze TLS 1.0, v současnosti není možné blokovat SSL 3 a povolit všechny tři TLS (podle changelogu má být toto možné v připravované verzi Tomcat 7.0.57)SSLCipherSuite
- povolené šifrySSLHonorCipherOrder
- server určuje pořadí šiferSSLVerifyClient
- klientská autentizace certifikátemSSLDisableCompression
- vypnutí SSL komprese, dostupné od verze 7.0.36
Příklad konfigurace
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol" port="8443" SSLEnabled="true" secure="true" scheme="https" SSLProtocol="ALL" SSLCipherSuite="EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!SEED" SSLHonorCipherOrder="true" SSLDisableCompression="true" SSLCertificateFile="/path/to/certificate" SSLCertificateChainFile="/path/to/CA_certificates" SSLCertificateKeyFile="/path/to/private/key" SSLPassword="passw" maxThreads="200" acceptCount="100" />
V příkladu je seznam šifer s využitím RC4, kvůli útoku POODLE a BEAST. Pokud bychom vypnuli SSL 3, tak můžeme použít stejný seznam, jak u Apache.
SSLCipherSuite="EECDH+AES:EDH+AES:EDH+CAMELLIA:EECDH+3DES:EDH+3DES:RSA+AES:RSA+CAMELLIA:RSA+3DES"
Microsoft Windows a IIS (Internet Information Services)
Microsoft používá pro SSL/TLS systémovou knihovnu schannel.dll
, takže tato je využívána i v IIS. Záleží na verzi operačního systému jaké protokoly a šifry jsou defaultně povoleny a jaké podporovány.
Windows Server 2003 nepodporuje TLS 1.1 a TLS 1.2, eliptické křivky, standardně nepodporuje šifrování AES, to ale můžeme dodat pomocí hotfixu KB948963, popis je v článku An update is available to add support for the TLS_RSA_WITH_AES_128_CBC_SHA AES128-SHA and TLS_RSA_WITH_AES_256_CBC_SHA AES256-SHA AES cipher suites in Windows Server 2003. Také nemůžeme určit preferované pořadí šifer.
Ještě na Windows Server 2008 R2 (a tedy IIS 7.5) je defaultně povolen nebezpečný protokol SSLv2. Jde o první systém, který podporuje TLSv1.1 a TLSv1.2, ale tyto nejsou zapnuté. Windows Server 2012 je na tom o dost lépe, ale pořád můžeme nastavení vylepšit. Protokol SSL 2 je vypnutý a všechny tři verze TLS jsou povolené. Používají se šifrovací algoritmy RC4, 3DES a AES a hashe MD5 a SHA.
Pozn.: Při úpravě nastavení pro Windows si musíme dát pozor a vše důkladně otestovat. Protože nastavení ovlivní vše, kde Windows používají SSL/TLS, tedy třeba i RDP protokol. Tato systémová nastavení ovlivňují i takovou aplikaci jako je Forefront Threat Management Gateway.
Celá konfigurace SSL/TLS (tedy nastavení schannel.dll) se provádí pomocí úpravy registrů a nachází se v cestě HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
. Oficiální popis má Microsoft v KB How to restrict the use of certain cryptographic algorithms and protocols in Schannel.dll. Nějaký (určitě ne ideální) seznam podporovaných šifer je v dokumentu Cipher Suites in Schannel.
Pozn.: Seznam šifer je omezený (třeba oproti OpenSSL), takže třeba není podporováno DHE-RSA, ale pouze DHE-DSS. Pokud nebudeme mít daný typ certifikátu, tak nám tuto šifru nebude server nabízet.
Pořadí šifer můžeme navíc definovat pomocí skupinových politik (GPO). V Group Policy jde o Computer Configuration/Policies/Administrative Templates/Network/SSL Configuration Settings/SSL Cipher Suite Order
, malý popis je v článku Prioritizing Schannel Cipher Suites.
Nastavení pomocí PowerShellu
Úpravu nastavení můžeme provést přímou změnou registrů nebo k tomu samému využít PowerShell. Takový hezký skript i s komentáři napsal Alexander Hass a je uveden v článku Setup your IIS for SSL Perfect Forward Secrecy and TLS 1.2. Já bych oproti použitým nastavením zablokoval i RC4 a MD5. Níže uvádím takto lehce upravený skript (doporučuji se podívat na originál).
Skript v PowerShellu provede změnu registrů. Jde o zakázání SSL 2.0 a PCT 1.0 (pro jistotu, je již od Windows Server 2003 defaultně vypnutý, jde o starý MS protokol), povolení (nastavení) TLS 1.0, TLS 1.1, TLS 1.2. Dále vypnutí slabých šifer NULL, RC2, RC4, DES a povolení 3DES a AES (některé hodnoty jsou již defaultně nastaveny stejně), zakázání MD5 a povolení SHA, povolení KeyExchange algoritmů DH a PKCS (součástí je RSA). A nakonec nastavení pořadí šifer. Je třeba jej spustit s právy administrátora. Některé změny nastavení se projeví rovnou, některé až po restartu serveru. Skript jsem zkoušel na Windows Server 2008 R2.
Pozn.: Než začneme měnit registry, tak je dobré si udělat zálohu. Pomocí regedit
nebo třeba příkazem reg export HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL zaloha-schannel.reg
# vypnutí SSL 2.0, PCT 1.0, zapnutí/nastavení TLS 1.0, TLS 1.1, TLS 1.2 md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server' -name Enabled -value 0 -PropertyType 'DWord' –Force md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server' -name Enabled -value 0 -PropertyType 'DWord' -Force md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -name 'Enabled' -value 1 -PropertyType 'DWord' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'Enabled' -value 1 -PropertyType 'DWord' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force # vypnutí a zapnutí šifer $insecureCiphers = 'NULL','RC2 40/128','RC2 56/128','RC2 128/128','RC4 40/128','RC4 56/128','RC4 64/128', 'RC4 128/128','DES 56/56' Foreach ($insecureCipher in $insecureCiphers) { $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($insecureCipher) $key.SetValue('Enabled', 0, 'DWord') $key.close() } $secureCiphers = 'Triple DES 168/168','AES 128/128','AES 256/256' Foreach ($secureCipher in $secureCiphers) { $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($secureCipher) $key.SetValue('Enabled', 0xffffffff, 'DWord') $key.close() } # vypnutí a zapnutí hash algoritmů md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5' -name Enabled -value '0' -PropertyType 'DWord' -Force md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force # zapnutí KeyExchange algoritmů md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS' -Force New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force # nastavení pořadí šifer New-ItemProperty -path 'HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002' -name 'Functions' -value 'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA' -PropertyType 'String' -Force
Na Windows Server 2003 hůře spustíme PowerShell, tak níže je ukázka reg
souboru pomocí kterého můžeme upravit registry. Neobsahuje zbytečně nastavení nepodporovaných TLS 1.1, TLS 1.2 a pořadí šifer.
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server] "Enabled"=dword:00000000 "DisabledByDefault"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Client] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server] "Enabled"=dword:00000000 "DisabledByDefault"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client] "DisabledByDefault"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server] "Enabled"=dword:00000000 "DisabledByDefault"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server] "Enabled"=dword:ffffffff "DisabledByDefault"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server] "Enabled"=dword:ffffffff "DisabledByDefault"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL] "EventLogging"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 128/128] "Enabled"=dword:ffffffff [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 256/256] "Enabled"=dword:ffffffff [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\DES 56/56] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\NULL] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 128/128] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 40/128] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 56/128] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 128/128] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 40/128] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 56/128] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 64/128] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\Triple DES 168/168] "Enabled"=dword:ffffffff [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA] "Enabled"=dword:ffffffff [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms] [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman] "Enabled"=dword:ffffffff [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS] "Enabled"=dword:ffffffff
Nastavení pomocí aplikace IIS Crypto
PowerShell skript můžeme využít pro nastavení celé skupiny serverů. Pokud nastavujeme pouze jeden server, tak se může hodit malá a pěkná aplikace v .NETu IIS Crypto od Nartac Software. Podporuje Windows Server 2003, 2008, 2008 R2, 2012, 2012 R2. Můžeme pomocí ní nastavit povolené protokoly, šifry, hash i algoritmy pro výměnu klíčů, také můžeme sestavit pořadí šifer. Navíc jsou zde tlačítka pro doporučené nastavení. Jediná vada na kráse je, že třeba i na Windows Server 2003 ukazuje protokol TLS 1.2, který zde ale podporovaný není.
Zranitelnost TLS/SSL Renegotiation
V knihovně SChannel je známa zranitelnost SSL 3.0 a TLS 1.0 protokolu CVE-2009-3555 Insecure Client-Initiated Renegotiation, která tím pádem ovlivňuje IIS, ale také třeba ISA / TMG. Řešením je konfigurace Renegotiation pomocí registrů, můžeme zapnout bezpečné vyjednávání (dle RFC 5746) nebo jej úplně vypnout. Microsoft upozorňuje, že změna může způsobit nějaké problémy (určitým aplikacím při autentizaci certifikátem), takže je dobré důkladně otestovat.
Tato vlastnost se do starších Windows doplní pomocí instalace patche KB980436 a případně KB977377 (dostupný na Windows Update) od Windows Server 2008 R2 je součástí systému. Popis v článcích Microsoft Security Advisory 977377, Microsoft Security Bulletin MS10-049 - Critical, ISA 2006 / TMG 2010: DISABLE CLIENT-INITIATED SSL RENEGOTIATION, PROTECTING AGAINST DOS ATTACKS AND MALICIOUS DATA INJECTION.
Nastavení se provádí v registrech v cestě HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL
, kde vytvoříme požadované DWORD hodnoty.
AllowInsecureRenegoClients
- 1 kompatibilní mód, klient se připojí ke všem serverům, 0 striktní mód, klient použije renegotiation pouze se servery s bezpečnou metodouAllowInsecureRenegoServers
- 1 kompatibilní mód, server povolí všechny klienty, 0 striktní mód, server vyžaduje klienty s bezpčeným vyjednávánímDisableRenegoOnClient
- 1 vypnuto, klient nepoužívá renegotiation, 0 nebo neexistuje klíč zapnutoDisableRenegoOnServer
- 1 vypnuto, server nepoužívá renegotiation, 0 nebo neexistuje klíč zapnuto
Pozn.: Nastavení v registrech nevyžaduje restart, ale projeví se hned.
Java aplikace a JSSE
Java aplikace a webové servery často využívají nativní implementaci SSL/TLS zvanou Jave Secure Socket Extensions (JSSE). To jsme již zmiňovali u Tomcatu. Pokud nemáme možnost konfigurace SSL na straně aplikace/serveru, tak můžeme konfigurovat přímo Javu a omezit/nastavit používané šifry. Příkladem webového serveru je Jetty, ten využívá například rozšířený XMPP server OpenFire, ten navíc používá knihovnu Bouncy Castle.
Konfigurace (je dostupná až pro Java 7) se provádí v souboru java.security
, který se nachází v Install_Home\jre\lib\security\
(třeba /usr/lib/jvm/java-1.7.0/jre/lib/security
či c:\Program Files (x86)\Java\jre7\lib\security\java.security
). Zde můžeme specifikovat zakázané algoritmy pro certifikáty.
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
A hlavně zakázané šifry pro SSL/TLS.
jdk.tls.disabledAlgorithms=MD2, MD5, RC4, DES, NULL, RSA keySize < 2048
Problém je zablokovat nějaký protokol, třeba protokol SSL 3, základní info je v článku Instructions to disable SSL v3.0 in Oracle JDK and JRE. Na mnoha místech zmiňovaný parametr -Dhttps.protocols="TLSv1"
mi nikde nezafungoval (Jetty, OpenFire, Tomcat).
Další odkazy
- SSL/TLS Deployment Best Practices – dokument o doporučeních pro nastavení SSL/TLS
- Testing for Weak SSL/TLS Ciphers, Insufficient Transport Layer Protection (OTG-CRYPST-001) – popis a metody pro testování
- Security/Server Side TLS - řada informací od Mozilly
- Compass SSL/TLS recommendations – stručné shrnutí rad na nastavení
- SSL/TLS configuration for Apache (mod_ssl) – nastavení Apache
- Configuring Apache, Nginx, and OpenSSL for Forward Secrecy – nastavení Apache
- SSL/TLS, ciphers, perfect forward secrecy and Tomcat – popis bezpečnosti a nastavení Tomcat
- Support for SSL/TLS protocols on Windows - podpora ve Windows
- How to Choose the Right Cipher Suites in Schannel.dll – Microsoft SSL
- Hardening SSL Cipher Strength and SSL Protocol Support on ISA Servers – MS ISA
- Disable Low and Medium Strength Cipher for Java Applications – nastavení JSSE
- SSL Cipher Configuration - removing weak ciphers – nastavení JSSE
Zatím zde nejsou žádné komentáře.