Protokollan ominaisuudet

rsa

dss

pgp

TLS-protokollan kättely

Paras lähde TLS-protokollan toiminnan ymmärtämiseen on sitä käsittelevä standardi (RFC-5246: The Transport Layer Security (TLS) Protocol Version 1.2). Tärkein ja monimutkaisin osa-alue protokollassa koskee kättelyä, jonka aikana osapuolet tunnistavat toisensa, neuvottelevat käytettävästä salauksesta ja neuvottelevat yhteyden aikana käytettävistä salausavaimista. Lisäksi suurin osa erilaisista ongelma- ja virhetilanteista johtuu siitä, että toinen kättelyn osapuolista ei hyväksy vastapään tarjoamia varmenteita tai salausalgoritmeja.

Seuraavassa on esitetty TLS-protokollan version 1.2 kättelyn kulku, kopioituna RFC-tekstistä. Versiossa 1.3 kättely tulee muuttumaan siten, että asiakas lähettää opportunistisesti enemmän tietoja itsestään käynnistäessään kättelyn, jolloin yhteys voidaan usein muodostaa vähemmällä keskustelulla. Periaatteessa tämä ei tule muuttamaan protokollan ominaisuuksia, mutta nopeuttaa kättelyä tyypillisesti useilla kymmenillä tai jopa sadoilla millisekunneilla.

      Client                                               Server

      ClientHello                  -------->
                                                      ServerHello
                                                     Certificate*
                                               ServerKeyExchange*
                                              CertificateRequest*
                                   <--------      ServerHelloDone
      Certificate*
      ClientKeyExchange
      CertificateVerify*
      [ChangeCipherSpec]
      Finished                     -------->
                                               [ChangeCipherSpec]
                                   <--------             Finished
      Application Data             <------->     Application Data

                   Figure 1.  Message flow for a full handshake

   * Indicates optional or situation-dependent messages that are not
   always sent.

TLS-kättelyn vaiheet toimivat karkeasti kuvattuna seuraavalla tavalla (kuten edellä mainitaan, tähdellä merkityt eivät ole pakollisia vaiheita):

  1. ClientHello: Asiakasohjelmisto aloittaa kättelyn lähettämällä session tunnisteena toimivan satunnaisnumeron ja kertomalla tukemansa ominaisuudet (esim. pakkaus- ja salausalgoritmit).
  2. ServerHello: Jos sekä asiakkaan että palvelimen tukemien ominaisuuksien listoilta löytyy käytettävissä oleva yhdistelmät, palvelin ilmoittaa yhteydessä käytettävät ominaisuudet.
  3. Certificate*: Palvelin lähettää käyttämänsä varmenteen ja siihen liittyvän varmennepolun.
  4. ServerKeyExchange*: Palvelin käynnistää yhteyden salauksen avaintenvaihdon. Sanoman sisältö riippuu aiemmin neuvotelluista avaintenvaihdon algoritmeista. Nykyään yleisimmin päädytään Diffie-Hellman -algoritmiin ja sanoma sisältää palvelimen allekirjoittamat satunnaisluvut, jotka myöhemmin yhdistettynä asiakkaan satunnaislukuihin muodostavat satunnaisen kertakäyttöisen salausavaimen. Palvelimen allekirjoituksen perusteella asiakas voi todentaa, että palvelimen edellisessä sanomassa (Certificate) lähettämät varmenteet ovat palvelimen hallinnassa.
  5. CertificateRequest*: Jos palvelin vaatii myös asiakkaan tunnistautuvan varmennepohjaisesti, palvelin kertoo asiakkaalle hyväksyttävät varmennetyypit ja varmentajat.
  6. ServerHelloDone: Palvelin ilmoittaa lähettäneensä toistaiseksi kaikki kättelyyn liittyvät sanomat ja odottavansa asiakkaan vastausta.
  7. Certificate*: Jos palvelin pyysi asiakasta tunnistautumaan (CertificateRequest) ja asiakkaalta löytyy yksi tai useampia hyväksyttävissä olevia varmenteita, asiakas lähettää varmenteet.
  8. ClientKeyExchange: Asiakas lähettää vastineensa aiemmin palvelimen lähettämään avaintenvaihdon käynnistyssanomaan (ServerKeyExchange). Useimmiten sanoma sisältää Diffie-Hellman -haasteen vastauksen, jonka perusteella molemmat osapuolet kykenevät muodostamaan yhteisen kertakäyttöisen salausavaimen.
  9. CertificateVerify*: Jos asiakas lähetti varmenteita (CertificateRequest, Certificate), asiakas lähettää edellisten kättelyn vaiheiden allekirjoituksen, joka on muodostettu käyttäen varmenteisiin liittyviä yksityisiä avaimia. Siten palvelin voi todentaa, että varmenteet ovat asiakkaan hallinnassa.
  10. ChangeCipherSpec: Asiakas kertoo vaihtavansa salattuun yhteyteen käyttäen tiettyjä salaualgoritmeja.
  11. Finished: Asiakas kuittaa kättelyn päättyneeksi.
  12. ChangeCiprherSpec: Palvelin kertoo vaihtavansa salattuun yhteyteen käyttäen tiettyjä salaualgoritmeja.
  13. Finished: Palvelin kuittaa kättelyn päättyneeksi.
  14. Application Data: Asiakas ja palvelin vaihtavat keskenään tietoja TLS-yhteydellä.

Jokainen TLS-protokollan vaiheista voi päätyä virheeseen, jolloin virheen havainnut osapuoli lähettää toiselle osapuolelle virhesanoman. Kaikki virhesanomat (ks. alla) ovat kuvattu tarkemmin RFC-dokumentissa ja niihin perehtyminen voi auttaa vianselvityksessä merkittävästi.

   enum { warning(1), fatal(2), (255) } AlertLevel;

   enum {
       close_notify(0),
       unexpected_message(10),
       bad_record_mac(20),
       decryption_failed_RESERVED(21),
       record_overflow(22),
       decompression_failure(30),
       handshake_failure(40),
       no_certificate_RESERVED(41),
       bad_certificate(42),
       unsupported_certificate(43),
       certificate_revoked(44),
       certificate_expired(45),
       certificate_unknown(46),
       illegal_parameter(47),
       unknown_ca(48),
       access_denied(49),
       decode_error(50),
       decrypt_error(51),
       export_restriction_RESERVED(60),
       protocol_version(70),
       insufficient_security(71),
       internal_error(80),
       user_canceled(90),
       no_renegotiation(100),
       unsupported_extension(110),           /* new */
       (255)
   } AlertDescription;

   struct {
       AlertLevel level;
       AlertDescription description;
   } Alert;

Useimmat virhetilanteet johtavat TLS-protokollan kättelyn tai muun sanomanvaihdon keskeytymiseen (fatal). Varoitukset (warning) ovat varsin harvinaisia.

Salausalgoritmeista

TLS tarvitsee toimiakseen yhdistelmän erilaisia salausalgoritmeja. Sallitut yhdistelmät vaihtelevat TLS-protokollan versionumeron mukaan. Jokaisella valitulla salausalgoritmilla on vaikutus yhteyden turvallisuuteen. Erityisesti vanhemmat TLS-versiot tukevat hyvinkin turvattomia yhdistelmiä, kun taas uusimmissa (1.2 & 1.3) versioissa vaaralliset yhdistelmät ovat harvinaisempia.

TLS-yhteys muodostuu konsensusperiaatteella siten, että turvallisin yhteyden osapuolten tukema yhdistelmä valitaan käyttöön. Teknisten toteuttajien on kuitenkin oltava tietoisia mahdollisista yhdistelmistä ja varmistettava, että toteutukset tukevat turvallisia ja estävät vaaralliset yhdistelmät. Tätä varten on tarjolla erilaisia apuvälineitä kuten Mozilla SSL Configuration generator ja standardeja kuten kansalliset kryptografiset vahvuusvaatimukset.

Alla on esitetty yksi esimerkki mahdollisista salausalgoritmien yhdistelmistä. Yhdistelmä on turvallisimmasta päästä, eivätkä vanhemmat ohjelmistot välttämättä tue jokaista mainituista ominaisuuksista.

Algoritmin tyyppi Algoritmin tunniste Kuvaus
Algoritmiyhdistelmän koko nimi ECDHE-ECDSA-AES-256-GCM-SHA384 TLS 1.2 -versiossa standardoitu yhdistelmä
Avaintenvaihto ECDH - Elliptic Curve Diffie-Hellman Diffie-Hellman -algoritmin avaintenvaihto, jota käytetään tietoliikenneyhteyden alustamiseen.
Sessiokohtaiset avaimet E - Ephemeral Varsinaista viestien salausta varten muodostetaan kertakäyttöiset avaimet, jotka vaihdetaan osana avaintenvaihtoa. Tämä vaikeuttaa tietoliikenteen salauksen purkamista myöhemmin, vaikka osapuolten käyttämien varmenteiden salausavaimet vaarantuisivatkin.
Tunnistautuminen ECDSA - Elliptic Curve Digital Signature Algorithm Osapuolet tunnistautuvat suorittamalla allekirjoitusoperaation elliptisten käyrien avaimilla ja varmenteilla.
Salaus AES-256-GCM Tietoliikenne salataan käyttäen AES-256 -algoritmia Galois-Counter -tilassa.
Sisällön eheys AEAD Sisällön eheyttä ei tarvitse erikseen tarkistaa, koska GCM sisältää jo tarvittavat ominaisuudet.
Tiivistefunktio SHA384 Tiedon sijaan allekirjoitetaan tiivisteitä, jotka muodostetaan algoritmilla SHA-384.

Forward secrecy

Kun julkisen avaimen salausjärjestelmän yhteydessä käytetään kertakäyttöisiä satunnaisia salausavaimia, yksittäisen sanoman salausavaimien vaarantuminen ei vaaranna muiden sanomien turvallisuutta. Ominaisuus tunnetaan nimellä forward secrecy tai joskus perfect forward secrecy.

Forward secrecy toimii siten, osapuolet tunnistavat toisensa hyödyntäen varmenteita ja sähköisiä allekirjoituksia. Tämän jälkeen muodostetaan satunnainen salausavain käyttötarkoitukseen suunnitellulla avaintenvaihdon algoritmilla (yleensä Diffie-Hellman) ja käytetään satunnaista salausavainta myöhemmissä vaiheissa. Salausavain tuhotaan välittömästi yhteyden päätyttyä, joten salauksen purkaminen ei ole enää mahdollista.

Ennen forward secrecy -ominaisuutta palvelimen yksityisen avaimen vaarantuminen on johtanut siihen, että tietoliikenteen turvallisuus on vaarantunut takautuvasti. Jos jollakulla on ollut hallussaan esimerkiksi tietoliikenteen äänite aiemmista yhteyksistä, niiden sisältö on ollut myöhemminkin purettavissa. Forward secrecy onkin kehitetty antamaan lisäsuojaa varmenteiden yksityisten avaimien vaarantumista vastaan.

Listan TLS:n tukemista forward secery -algoritmiyhdistelmistä pystyy tulostamaan seuraavalla komennolla. Komento sisältää lisäksi valitsimet, jotka poistavat yleisesti turvattomina pitämät salausalgoritmit listalta.

$ openssl ciphers -v 'HIGH+ECDH HIGH+DH !aNULL'
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-ECDSA-AES256-CCM8 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM8(256) Mac=AEAD
ECDHE-ECDSA-AES256-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(256) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-CCM8 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM8(128) Mac=AEAD
ECDHE-ECDSA-AES128-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(128) Mac=AEAD
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
ECDHE-ECDSA-CAMELLIA256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=Camellia(256) Mac=SHA384
ECDHE-RSA-CAMELLIA256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=Camellia(256) Mac=SHA384
ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
ECDHE-ECDSA-CAMELLIA128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=Camellia(128) Mac=SHA256
ECDHE-RSA-CAMELLIA128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=Camellia(128) Mac=SHA256
ECDHE-ECDSA-AES256-SHA  TLSv1 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
ECDHE-RSA-AES256-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
ECDHE-ECDSA-AES128-SHA  TLSv1 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1
ECDHE-RSA-AES128-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=DH       Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD
DHE-RSA-AES256-CCM8     TLSv1.2 Kx=DH       Au=RSA  Enc=AESCCM8(256) Mac=AEAD
DHE-RSA-AES256-CCM      TLSv1.2 Kx=DH       Au=RSA  Enc=AESCCM(256) Mac=AEAD
DHE-DSS-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-CCM8     TLSv1.2 Kx=DH       Au=RSA  Enc=AESCCM8(128) Mac=AEAD
DHE-RSA-AES128-CCM      TLSv1.2 Kx=DH       Au=RSA  Enc=AESCCM(128) Mac=AEAD
DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
DHE-DSS-AES256-SHA256   TLSv1.2 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA256
DHE-RSA-CAMELLIA256-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=Camellia(256) Mac=SHA256
DHE-DSS-CAMELLIA256-SHA256 TLSv1.2 Kx=DH       Au=DSS  Enc=Camellia(256) Mac=SHA256
DHE-RSA-AES128-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256
DHE-DSS-AES128-SHA256   TLSv1.2 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA256
DHE-RSA-CAMELLIA128-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=Camellia(128) Mac=SHA256
DHE-DSS-CAMELLIA128-SHA256 TLSv1.2 Kx=DH       Au=DSS  Enc=Camellia(128) Mac=SHA256
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1
DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(256) Mac=SHA1
DHE-DSS-CAMELLIA256-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(256) Mac=SHA1
DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-DSS-AES128-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA1
DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(128) Mac=SHA1
DHE-DSS-CAMELLIA128-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(128) Mac=SHA1

Laajemmissa yritysympäristöissä forward secrecy aiheuttaa valitettavasti haasteita. Usein on tarpeen, että yrityksen tietoliikennettä pystytään suojaamaan tunkeilun havaitsemisjärjestelmillä (engl. Intrusion Detection System) ja estämisjärjestelmillä (engl. Intrusion Prevention System). Aiemmin em. järjestelmille voitiin antaa kopiot yrityksen palvelimien yksityisistä avaimista, jolloin tuotteet kykenivät tarkkailemaan ikäänkuin sivusta tietoliikennettä purkaen tietoliikenteen salauksen.

Ongelma on kierrettävissä mm. siten, että tietoliikenteen tarkkailu sijoitetaan varsinaisten palvelimien ja TLS-terminoinnin (esimerkiksi älykäs kuormantasaaja) väliin. Lisäksi palvelinsovelluksiin voidaan upottaa agentit, jotka ottavat ylös muodostetut kertakäyttöiset salausavaimet ja välittävät ne tietoliikennettä tarkkaileville tuotteille. Molemmat vaihtoehdot monimutkaistavat teknistä toteutusta merkittävästi.

results matching ""

    No results matching ""