クラウドを支えるこれからの暗号技術: https://herumi.github.io/ango/ の第一部を前提に、SSL(TLS)について解説します
- SSLにおける鍵交換: DH, RSA, .... の解説 - SSLネゴシエーション: 具体的にどのようなメッセージがやりとりされているかの解説 - SSLセッションの再利用
SSLษڧձʮΫϥυΛࢧ͑Δ͜Ε͔Βͷ҉߸ٕज़ʯΛಡΜͰ2016/11/22 mashijp
View Slide
ࠓͷSSLษڧձͷత• SSL / TLS ͰͲͷΑ͏ʹ҉߸௨৴͕ߦΘΕ͍ͯΔ͔Λղઆ͠ͳ͕Βٞ͠Α͏• ରऀ• ʮΫϥυΛࢧ͑Δ͜Ε͔Βͷ҉߸ٕज़ʯͷୈҰ෦ΛಡΜͰ۩ମతʹͲ͏௨৴͍ͯ͠Δͷ͔ؾʹͳͬͨਓ• ͜ͷຊΛલఏʹΛਐΊΔ• SSLͰެ։伴҉߸Λ͏͜ͱαʔόূ໌ॻΛ͏͜ͱ͍ͬͯΔ͕ɺγʔέϯεΒͳ͍ਓ• ূ໌ॻൃߦػؔ, ೝূہͷ͠ͳ͍※ ΫϥυΛࢧ͑Δ͜Ε͔Βͷ҉߸ٕज़ … https://herumi.github.io/ango/
SSL / TLS• SSL (Secure Sockets Layer)• SSL 2.0, 3.0 (੬ऑͳͨΊར༻ېࢭ)• ΦϫίϯͳΜͰΕΑ͏• TLS (Transport Layer Security)• SSL ͷޙܧɻ৽͍͠SSLͱࢥ͍ͬͯΕOK• TLS 1.0, 1.1, 1.2 (ΈΜͳઈࢍར༻த)• TLS 1.3 (ࡦఆத)• ͜ͷࢿྉͰҰ෦Λআ͖ ·ͱΊͯ SSL ͱදه
SSLͲ͏ͬͯ҉߸Խ௨৴Λఏڙ͢Δͷ͔• ͓͓ͬ͟ͺʹݴ͏ͱ࣍ͷྲྀΕ1. ҉߸Խ௨৴Λ͢ΔͨΊͷڞ௨伴Λ҆શʹަ͢Δ2. ަͨ͠伴Ͱڞ௨伴҉߸Λߦ͍ΓͱΓ͢Δ• AESͱ͔Ͱ҉߸௨৴• Ͳ͏ͬͯڞ௨伴Λ҆શʹަ͢Δͷ͔ʁ
SSLʹ͓͚Δ伴ަ
෮श - Diffie-Hellman (DH) 伴ڞ༗ (3.3ষ, Ҿ༻)• ̍̌̌̌̌̌̌̌ճʹग़ͯ͘ΔΜͰࢥ͍ग़ͯ͠Լ͍͞
෮श - RSA (3.16ষ, Ҿ༻)• ެ։伴҉߸ ͱ σδλϧॺ໊ Λಉ࣌ʹ࣮ݱ
伴ަ: DH• αʔό͔ΒDHެ։Λૹ৴ͯ͠Β͍ɺΫϥΠΞϯτͦͷ݁ՌΛͬͯαʔόʹܭࢉΛૹΓฦ͢• ௨৴Λ౪ௌ͞Εͯڞ௨伴ྲྀग़͠ͳ͍• தؒऀ߈ܸʹΑΓ伴Λࠩ͠ସ͑Δ͜ͱ͕ՄೳDHެ։ KA(=gamodp), g, pKB(=gbmodp)abDHެ։gabmodp ͔Βڞ௨伴ੜ gabmodp ͔Βڞ௨伴ੜ(ൿີ) (ൿີ)
伴ަ: DH + RSA• αʔόূ໌ॻ͕RSAͷ߹ʹར༻Մೳ• αʔό͔Βૹ৴͢ΔDHެ։ʹαʔόূ໌ॻͷൿີ伴Ͱॺ໊͢Δ• ΫϥΠΞϯτॺ໊Λαʔόূ໌ॻͷެ։伴Ͱݕূ͢Δ• ެ։伴ೝূہʹΑͬͯॺ໊͞Ε͍ͯΔͨΊվ͟ΜͷڪΕͳ͍
伴ަ: RSA• ΫϥΠΞϯτͰڞ௨伴Λੜ͠αʔόͷެ։伴Ͱ҉߸Խ͠ૹ৴͢Δ• ෮߸Ͱ͖Δͷެ։伴ʹରԠ͢Δൿີ伴Λͭαʔό͚ͩRSAαʔόূ໌ॻ(ެ։伴)ڞ௨伴Λެ։伴Ͱ҉߸Խ͠ૹ৴
Forward Secrecy / લํൿಗੑ (5.8ষ)• αʔό্ͷൿີ伴͕ྲྀग़͢ΔͱͲ͏ͳΔ͔ʁ• ྫ) αʔόͷRSAൿີ伴͕ྲྀग़• RSA ʹΑΔ伴ަ• ڞ௨伴ΛRSAެ։伴Ͱ҉߸Խ͠ΓͱΓ͍ͯ͠Δ͚ͩ• ௨৴Λه͍ͯ͠ΕաڈʹḪͬͯ҉߸จΛ෮߸Ͱ͖Δ• DH (+ RSA) ʹΑΔ伴ަ• DHͷ(=ڞ௨伴)Λຖճม͍͑ͯΔͳΒ෮߸Ͱ͖ͳ͍• ൿີ伴ྲྀग़ޙதؒऀ߈ܸͷڪΕ͕͋Δ
Forward Secrecy / લํൿಗੑ (5.8ষ)• RSAൿີ伴ظʹͬͯΘΕΔ• ྫ) ༗ޮظݶ1ʙ3ͷSSLূ໌ॻऔಘ• ظʹͬͯΘΕΔ伴͕࿙Ӯͨ͠ͱͯ͠ɺͦΕΑΓաڈͷ҉߸จΛ෮߸Ͱ͖ͳ͍͜ͱΛ લํൿಗੑ ͱ͍͏ (FS: Forward Secrecy)• “ʮCRYPTREC Report 2013ʯͷ 4ʮPerfect Forward Secrecy ʹؔ͢Δٕज़తݟղʹ͍ͭͯʯʹΑΔͱ PFS ͱ FS ͷҧ͍ʹؔ͢Δ౷Ұతݟղͳ͍ͱͷ͜ͱͰ͢. “• …ͩͦ͏Ͱ͢ɻؾʹ͠ͳ͍Ͱ͓͖·͠ΐ͏…
લํൿಗੑʹؔ͢Δ࣮ࡍͷࣄ݅ (5.8ষ)• ΞϝϦΧࠃՈ҆શอোہ (NSA) ͕Πϯλʔωοτͷ௨৴Λ౪ௌ, อଘ, ղੳ͍ͯͨ͜͠ͱ͕໌Β͔ʹͳΔ• ͞ΒʹFBI͕ϝʔϧࣄۀऀʹαʔόൿີ伴ͷఏग़ΛٻΊͨ• ଟRSAൿີ伴• ௨৴ͷอଘ + ൿີ伴ͷྲྀग़ => աڈͷ௨৴ͷ࿙Ӯ ͕ݱ࣮ʹ• લํൿಗੑ͕ΑΓٻΊΒΕΔΑ͏ʹͳͬͨ• TLS 1.3(࡞த) Ͱલํൿಗੑ͕ͳ͍伴ަར༻Ͱ͖ͳ͘ͳΔݟࠐΈ
伴ަํࣜͷදݱ• DHE_RSA ͷΑ͏ʹදݱ͢Δ• DH … 伴ަϝΧχζϜ• E … Ephemeral (Ұ࣌తͳ) / ڞ௨伴Λຖճੜ• RSA … 伴ͷॺ໊• DH_RSA ͣͬͱಉ͡伴(DHͷύϥϝʔλ)Λ༻• લํൿಗੑͳ͍• ୭ಘ͠ͳ͍͠Ε·͠ΐ͏
伴ަํࣜ·ͱΊ໊শ 伴ަ 伴ͷॺ໊ લํൿಗੑ34" 34" ॺ໊ෆཁ ☓%)@34" %) 34" ☓%)&@34" %) 34" ˓&$%)&@34" &$%) 34" ˓&$%)&@&$%4" &$%) &$%4" ˓
(ࢀߟ) 伴ަํࣜͱͦͷෛՙʹ͍ͭͯ• ͡Ό͋શ෦ DHE_RSA ͕͍͍͡ΌΜʂ• → ҰൠʹDHE_RSA ૬ॏ͍ͱݴΘΕΔ• ͜ͷษڧձͰৄ͘͠৮Εͳ͍͕ɺ伴ަํࣜʹΑͬͯෛՙ͕େ͖͘ҟͳΔ• 伴ަํࣜΛมߋ͢Δ߹ेݕ౼͔ͯ͠Βʹ͢Δ͜ͱ
SSLωΰγΤʔγϣϯ
SSLωΰγΤʔγϣϯ• ͔͜͜ΒSSL௨৴ͷཱ֬(SSLωΰγΤʔγϣϯ) = ڞ௨伴ͷަͷϑϩʔΛղઆ• ࠓճΑ͋͘ΔHTTPSαʔόΛར༻έʔεΛߟ͑Δ(αʔόূ໌ॻ͋ΓɺΫϥΠΞϯτূ໌ॻͳ͠)• ओʹ DHE_RSA, RSA ʹΑΔωΰγΤʔγϣϯΛղઆ• WiresharkͰ௨৴ΛͿͬ͜͵͖ͳ͕Β֬ೝ͢Δͱཧղ͕ḿ͓ͬͯ͢͢Ί
SSLωΰγΤʔγϣϯͷਤղ• SSLΛཧղ͢ΔͨΊͷجૅωΰγΤʔγϣϯ (Symantec)• https://www.jp.websecurity.symantec.com/welcome/pdf/wp_ssl_negotiation.pdf• 6ϖʔδͷਤ͕Θ͔Γ͍͢ (ൈਮ: ӈਤ)• ͜ͷਤΛݟͳ͕ΒൃදΛ ฉ͍ͯΒ͑Δͱ͍͍ײ͡
(ࢀߟ) SSLʹؔ͢ΔࢿྉΛ୳͢ͱ͖ͷҙ• ʮੜͨ͠ڞ௨伴Λαʔόͷެ։伴Ͱ҉߸Խ͠αʔόʹૹΔʯͱղઆͨ͠ࢿྉ͕͔ͳΓଟ͍• ݫີʹ͜Εؒҧ͍Ͱ͋Δ͜ͱʹҙ• ྫ) DH αʔόͷެ։伴ʹؔͳ͘伴ަͰ͖Δ
Cipher Suite• SSLͰҎԼͷ3ͭͷཁૉ͕ඞཁ• 伴ަΞϧΰϦζϜ• ڞ௨伴҉߸• ϋογϡؔ• ͜ΕΒΛΈ߹Θͤͯදݱ• ྫ) ECDHE_RSA_WITH_AES_128_GCM_SHA256• 伴ަ ECDH, 伴 Ephemeral (ຖճੜ)• ڞ௨伴҉߸ AES-128 GCMϞʔυ• ϋογϡؔ SHA-256• SSLωΰγΤʔγϣϯ࣌ʹͲͷCipher SuiteΛ͏͔߹ҙ͢Δ
1. Client Hello ->• αʔόʹର͠ɺSSLͷཱ֬Λґཔ͢Δ• ૹ৴͢Δओཁͳσʔλ• client_version: ཱ͍֬ͨ͠SSLͷόʔδϣϯ (ྫ: TLS1.2)• session_id (ޙड़)• cipher_suites: ରԠ͢ΔCipher SuiteҰཡ (༏ઌॱҐ͖)
2. <- Server Hello• ૹ৴͢Δओཁσʔλ• server_version: બͨ͠TLSͷόʔδϣϯ (ྫ: TLS1.0)• ΫϥΠΞϯτ͕ఏࣔͨ͠ͷҎԼΛબͿ• session_id (ޙड़)• cipher_suite: બͨ͠Cipher Suite• ΫϥΠΞϯτ͕ఏࣔͨ͠ͷ͔ΒબͿ• Ͳͷ TLSͷόʔδϣϯ / Cipher Suite ΛબͿ͔αʔόͷࣗ༝• Cipher Suite ༏ઌॱҐ͖ͰΫϥΠΞϯτ͔ΒఏҊ͞ΕΔ͕࠷ऴతͳܾఆݖαʔόʹ͋Δ
தؒऀ߈ܸʹৗʹཹҙTLS 1.2Ͱ• SSLωΰγΤʔγϣϯ࣌ʹ҉߸௨৴ཱ֬લͳͷͰɺ௨৴Λվ͟Μ͢Δ༨͍͘ΒͰ͋Δ• ྫ) Cipher Suite Λதؒऀ߈ܸʹΑͬͯݻఆԽͤ͞Δ• ྫ) TLSͷόʔδϣϯΛதؒऀ߈ܸʹΑͬͯԼ͛Δ(Լਤ)• SCSV ͱ͍͏৽͍͠ΈͰ͕Εͦ͏ https://tools.ietf.org/html/rfc7507TLS 1.0 ͰOK, TLS 1.0TLS1.0ʙTLS1.2 ʹରԠTLS1.0ʙTLS1.2 ʹରԠѱҙ͋Δ தؒऀ
3. <- Server Certificate• Cipher Suite ʹ߹கͨ͠αʔόͷূ໌ॻΛૹ৴͢Δ• RSA, DHE_RSA, ECDHE_RSA• → RSAূ໌ॻ• ECDHE_ECDSA• → ECDSAূ໌ॻ• ྫ͑ɺECDHE_RSA ͱ ECDHE_ECDSA ͷ྆ํʹରԠ͍ͨ͠ͳΒ2छྨͷূ໌ॻΛαʔόʹઃఆ͢Δඞཁ͕͋Δ
4. <- Server Key Exchange (DHE, ECDHEͷ߹ͷΈ)• 伴ަʹඞཁͳใΛ͢• ૹ৴σʔλ• DHͷ߹• DHͷެ։• signed_params• DH(ECDH)ύϥϝʔλʹαʔόൿີ伴Ͱॺ໊Λ͢Δ• DHE_RSA ͳΒ RSAαʔόূ໌ॻ ECDHE_ECDSA ͳΒ ECDSAαʔόূ໌ॻ Λ “3. Server Certificate” Ͱૹ৴͢Δඞཁ͕͋ΔKA(=gamodp), g, p
5. <- Server Hello Done• ΫϥΠΞϯτʹʮ४උͰ͖ͨΑʙʯͬͯ͑Δ͚ͩ
6. Client Key Exchange ->• 伴ަʹඞཁͳใΛ͢• DHͷ߹• ɹɹɹɹɹɹΛૹ৴• RSAͷ߹• ΫϥΠΞϯτͰڞ௨伴Λੜ͠ɺαʔόূ໌ॻ͔ΒऔΓग़ͨ͠ެ։伴Ͱ҉߸Խɺૹ৴KB(=gbmodp)
7. <- Change Cipher Spec ->• ͜ΕҎ߱҉߸Խ௨৴Λߦ͏͜ͱΛએݴ͢Δ• αʔό/ΫϥΠΞϯτํ͔Βૹ৴͢Δ• ͜͜·Ͱͷϝοηʔδ҉߸Խɾೝূ͞Ε͍ͯͳ͍
8. <- Finished ->• 伴ަ, ೝূ͕ྃͨ͜͠ͱΛද͢• Change Cipher Spec ͷޙʹૹ৴• ͭ·Γ҉߸Խ͞Ε͍ͯΔ• ਖ਼͘͠҉߸௨৴͕Ͱ͖͍ͯΔ͜ͱͷ֬ೝʹͳΔ
SSLηογϣϯͷ࠶ར༻
SSLωΰγΤʔγϣϯίετ͕ߴ͍• ྫ͑DHE_RSAͷ߹ʹαʔό͕Δ͜ͱ…• DHެ։ͷੜ• RSAൿີ伴(2048bitʙ)Λͬͯ͜Εʹॺ໊• →ෛ୲͕େ͖͍ʂ• ΓͱΓͷճଟ͍ͨΊωοτϫʔΫԆ͕େ͖͍ͱηογϣϯͷཱ֬·Ͱʹ͕͔͔࣌ؒͬͯ͠·͏• 2ճҎ߱ͷ௨৴ָΛ͍ͨ͠• → ηογϣϯΛ࠶։͠Α͏ (Session Resumption)KA(=gamodp), g, p
ηογϣϯIDʹΑΔSession Resumption• 1ճͷωΰγΤʔγϣϯͰαʔό͔ΒηογϣϯID͕ฦ͞ΕΔ(Server Hello)• 2ճଓ࣌ɺΫϥΠΞϯτ͕ͦͷηογϣϯIDΛ༩ͯ͠Client HelloΛ͢Δ• ηογϣϯIDΛجʹɺલճͷCipher Suiteɺڞ௨伴Ͱ࠶։• αʔό͕ ηογϣϯID ͱ Cipher Suite, ڞ௨伴ͷωΰγΤʔγϣϯ݁Ռͷͻ͖Λอଘ͓͔ͯ͠ͳ͚ΕͳΒͳ͍ͱ͍͏͜ͱ• = αʔόεςʔτϑϧʹͳΔServer Hello (࠶։OK!)Client Hello (ηογϣϯID͖)͓ޓ͍طʹ͍ͬͯΔڞ௨伴Ͱ҉߸௨৴ID͔Βલճͷ ݁ՌΛऔΓग़͢
ηογϣϯIDʹΑΔSession Resumptionͷ• ηογϣϯIDͱωΰγΤʔγϣϯ݁ՌΛͲ͜ʹอ࣋͢Δ͔ʁ• ϑϩϯταʔό͕ෳ͋Δ߹ʹʹͳΔ• αʔόAͰωΰγΤʔγϣϯ, 2ճαʔόBʹଓ → Resumption Ͱ͖ͳ͍• memcached ʹอ࣋ͤ͞ΔΑ͏ͳέʔε͋ΔmemcachedͳͲηογϣϯIDใͷऔಘ
ηογϣϯνέοτʹΑΔSession Resumption• ωΰγΤʔγϣϯ݁ՌΛઐ༻ͷαʔό伴Ͱ҉߸Խͨ͠ͷΛΫϥΠΞϯτʹ͢• ͜ΕΛʮηογϣϯνέοτʯͱݺͿ• ΫϥΠΞϯτ෮߸ɾվ͟ΜͰ͖ͳ͍• αʔόঢ়ଶΛ࣋ͨͳͯ͘Α͘ͳΔ• ηογϣϯIDํࣜͷ߹ʹ memcached ʹอଘ͍ͯͨ͠ͷΛ҉߸Խ͠ɺΫϥΠΞϯτʹ͢Πϝʔδ• = αʔόεςʔτϨεʹͳΔ(ωΰγΤʔγϣϯ)νέοτΛ ෮߸νέοτΛૹ৴
ηογϣϯνέοτʹΑΔSession Resumption• 2ճଓ࣌ɺΫϥΠΞϯταʔόʹηογϣϯνέοτΛ͢• αʔόνέοτ༻ͷ伴Λͬͯ෮߸͠ɺڞ௨伴Cipher SuiteΛऔΓग़͢Client Hello (ηογϣϯνέοτ͖)νέοτΛ ෮߸Server Hello (࠶։OK!)લճͷڞ௨伴Ͱ҉߸௨৴
ෳͷαʔόͱηογϣϯνέοτ• ͋Β͔͡Ίશͯͷαʔόʹશ͘ಉ͡νέοτ༻ͷ伴Λઃఆ͓͚ͯ͠ Ͳͷαʔόʹଓͯ͠ηογϣϯΛ࠶։Ͱ͖Δ• memcached ͳͲͰσʔλΛอ࣋͢Δඞཁͳ͠νέοτ༻ͷ伴νέοτ༻ͷ伴νέοτΛ ෮߸νέοτΛ ෮߸
ηογϣϯνέοτͷ• νέοτ༻ͷ伴ͷ҆શੑΛͲ͏୲อ͢Δ͔ʁ• ͜ͷ伴͕ྲྀग़͢ΔͱαʔόҎ֎ͷୈࡾऀ͕νέοτΛ෮߸͢Δ͜ͱ͕Ͱ͖Δ = σʔλ௨৴༻ڞ௨伴͕ྲྀग़͢Δ• ͔ͤͬ͘ DHE_RSA Λ͍ͬͯͯલํൿಗੑ͕୲อͰ͖ͳ͍ڪΕ• νέοτ༻ͷ伴ΛظؒͰมߋ͢ΔͳͲͷରࡦ͕ඞཁ• વաڈͷ伴ഁغ
·ͱΊ
SSL·ͱΊ• ʮSSL௨৴ʯͱݴͬͯ҆શੑબͨ͠ΞϧΰϦζϜ(Cipher)ʹΑͬͯେ͖͘ҟͳΔ• લํൿಗੑ ͷ͋Δ Cipher ͷ҆৺ײ• TLS 1.3 Ͱલํൿಗੑͷͳ͍ Cipher ͑ͳ͘ͳΔงғؾ• SSLηογϣϯͷ࠶ར༻ઃఆັྗత͕ͩઃఆΛޡΔͱલํൿಗੑ͕ͳ͘ͳΔ• ͜ͷษڧձͷ༰ΛϕʔεʹɺSSLͷ੬ऑੑʹ͍ͭͯͷࣝ૿͍͖͍ͯͨ͠• μϯάϨʔυ߈ܸ, Renegotiationͷ੬ऑੑ….
ग़య/ࢿྉ• ࢿྉ - SSLϋϯυγΣΠΫ• ཧղͯ͠ΔͭΓͷSSL/TLSͰɺͬͱཧղͨ͠Β໘ന͔ͬͨ• http://tkengo.github.io/blog/2015/12/01/https-details/• TLSϓϩτίϧv1.2 (ຊޠ༁)• https://www.ipa.go.jp/security/rfc/RFC5246-00JA.html• ࣗତམͳٕज़ऀͷه• http://blog.livedoor.jp/k_urushima/archives/cat_38371.html• ࢿྉ - SSL ηογϣϯ࠶ར༻• લํൿಗੑ (forward secrecy) ΛͭΣϒαΠτͷਖ਼͍͠ઃఆํ๏• http://blog.kazuhooku.com/2015/07/forward-secrecy.html• Forward Secrecyͷམͱ݀͠ - ϫβϊό• http://wazanova.jp/items/874• Apache 2.4 ৽ػೳ SSLฤ• http://www.slideshare.net/nappa_zzz/apache-24-ssl• ࡉ͔͗ͯ͢ΘΒͳ͍SSL/TLS• https://techblog.yahoo.co.jp/infrastructure/ssl-session-resumption/
ग़య• ༻ͨ͠ը૾• ͘͞ΒͷΞΠίϯηοτ (৭ௐΛҰ෦มߋ)• http://knowledge.sakura.ad.jp/other/4724/• ωοτϫʔΫɹτϙϩδʔɹΞΠίϯ• http://www.cisco.com/web/JP/product/topology_icons.html