Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SSL のハンドシェイクについて
Search
firedial
May 28, 2020
Technology
0
440
SSL のハンドシェイクについて
firedial
May 28, 2020
Tweet
Share
More Decks by firedial
See All by firedial
家計簿管理システム Midas について / balance system Midas
firedial
1
260
Other Decks in Technology
See All in Technology
初海外がre:Inventだった人間の感じたこと
tommy0124
1
180
設計に疎いエンジニアでも始めやすいアーキテクチャドキュメント
phaya72
26
17k
プロファイルとAIエージェントによる効率的なデバッグ / Effective debugging with profiler and AI assistant
ymotongpoo
1
800
進化する大規模言語モデル評価: Swallowプロジェクトにおける実践と知見
chokkan
PRO
3
450
猫でもわかるAmazon Q Developer CLI 解体新書
kentapapa
1
300
AIがコードを書いてくれるなら、新米エンジニアは何をする? / komekaigi2025
nkzn
24
17k
[re:Inent2025事前勉強会(有志で開催)] re:Inventで見つけた人生をちょっと変えるコツ
sh_fk2
1
1.2k
GTC 2025 : 가속되고 있는 미래
inureyes
PRO
0
150
SREのキャリアから経営に近づく - Enterprise Risk Managementを基に -
shonansurvivors
1
720
AWSが好きすぎて、41歳でエンジニアになり、AAIを経由してAWSパートナー企業に入った話
yama3133
2
230
IBC 2025 動画技術関連レポート / IBC 2025 Report
cyberagentdevelopers
PRO
2
250
[Journal club] Thinking in Space: How Multimodal Large Language Models See, Remember, and Recall Spaces
keio_smilab
PRO
0
110
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
6.6k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Agile that works and the tools we love
rasmusluckow
331
21k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
For a Future-Friendly Web
brad_frost
180
10k
A better future with KSS
kneath
239
18k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How STYLIGHT went responsive
nonsquared
100
5.9k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Mobile First: as difficult as doing things right
swwweet
225
10k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
Transcript
SSL のハンドシェイクについて 〜絶対に守りたい秘密がある〜
自己紹介
自己紹介 • 名前: firedial • 生後: 10075日目 • 出身: 滋賀県東近江市
• 仕事: サーバーサイドエンジニア(PHP のはずだが最近は Vue.js と TypeScript を触っている) • 趣味: ビリヤード(自粛中)、都内散策(自粛中)、カメラ(自粛 中)、雀魂
今日のお話 • https 通信使われている技術ってなんだろう?? ◦ SSL というプロトコルが使われている!! ▪ どのように安全性が確保されているのだろうか? •
気になって調べてみた
前提知識
説明するに当たって必要な知識 • 共通鍵暗号方式 • 公開鍵暗号方式 • ハイブリッド暗号方式 • ハッシュ関数 •
メッセージダイジェスト • SSL/TLS
共通鍵暗号方式 • 秘密を共有したい 2 者間で同じ鍵を使う方式 • 種類: DES, 3DES, AES,
RC4 • 長所: 公開鍵暗号方式と比べて処理が早い • 短所: 通信する相手ごとに鍵を準備しないといけない
公開鍵暗号方式 • 暗号化する鍵と復号する鍵が異なる方式 • 種類: 後述 • 長所: 公開鍵と秘密鍵を 1
組作成すれば使いまわせる • 短所: 共通鍵暗号方式に比べて処理が遅い
公開鍵暗号方式 • 公開鍵暗号の目的は暗号化、鍵交換、署名の 3 つがある • 鍵交換 ◦ DH, RSA,
楕円曲線暗号 • 暗号化 ◦ RSA, 楕円曲線暗号 • 署名 ◦ RSA, DSA, 楕円曲線暗号 ※楕円曲線暗号は特定のアルゴリズムを指すものではない
ハイブリッド暗号 • 共通鍵暗号と公開鍵暗号両方使う方式 • 公開鍵暗号は共通鍵暗号の共通鍵を共有するために使う • 共有後は共通鍵を使って暗号化する ◦ SSL もこの方式である
ハッシュ関数 • 任意の長さのデータを固定長のデータに圧縮する、次の性質 を持つ関数 ◦ 一方向性 ◦ 第 2 原像計算困難性
◦ 衝突困難性 • MD5, SHA-1, SHA-256, SHA-512
メッセージダイジェスト • ハッシュ関数は MAC (Massage Authentication Code) という 技術でも使われる •
送信側と受信側で共通している秘密鍵 (MAC 鍵という) を用 いて真正性と完全性を保証する
メッセージダイジェスト(例) • MAC 鍵: hito_no_okane_de_yakiniku_tabetai • 送信したいメッセージ: 5000_choen_hoshii • sha-256(5000_choen_hoshii
+ hito_no_okane_de_yakiniku_tabetai) = b1b575b2ddd2057d254ef731b7106bef41af5f53277475e01789a31e31b3f7b6 • 送信者は 5000_choen_hoshii とハッシュ値 (MAC 値という) b1b57… を送る • 受信者は受け取ったメッセージと共有している MAC 鍵でメッ セージが正しいか検証する
SSL/TLS • SSL とは 2 台のマシン間を結ぶ安全な通信路を提供するプロ トコル • TLS は
SSL の後続のプロトコル • その二つは(中身は似ているものの)違うものである • TLS であっても SSL や SSL/TLS と呼ことが多い(らしい)
SSL のハンドシェイク
SSL 通信の全体像 クライアント サーバ TCP の 3 ウェイハンドシェイク SSL のハンドシェイク
データ転送 SSL の終了 TCP の切断 TCP SSL
SSL のハンドシェイクの目的 SSL のハンドシェイクの目的は 3 つある • クライアントとサーバでデータ保護にどのアルゴリズムを使う か共有する •
その暗号技術に使われる鍵を共有する • クライアントの認証 (必須ではない)
データ保護のアルゴリズム 暗号スイート 認証 鍵交換 暗号 ダイジェスト 番号 TLS_RSA_WITH_3DES_EDE_CBC_SHA RSA RSA
3DES_EDE_CBC SHA 0x000A TLS_DH_DSS_WITH_3DES_EDE_CBC_ SHA DSS DH 3DES_EDE_CBC SHA 0x000D TLS_RSA_WITH_RC4_128_MD5 RSA RSA RC4_128 MD5 0x0004 ※他にも暗号スイートはたくさんある https://tools.ietf.org/html/rfc5246#page-75
実際の接続
全体の流れ 右図のようなハンドシェイクを 行なっている ※次ページ以降で詳細を説明して いくが、今回の話題から逸れるとこ ろは割愛している クライアント サーバ Handshake: ClientHello
Handshake: ServerHello データ転送 Handshake: Certificate Handshake: ServerHelloDone Handshake: ClientKeyExchange ChangeCipherSpec Handshake:Finished ChangeCipherSpec Handshake:Finished
ClientHello • クライエントが使用できる 暗号スイート一覧を送る • 鍵生成用にランダムな 32 バイトの値を送る (client_random) クライアント
サーバ Handshake: ClientHello Handshake: ServerHello データ転送 Handshake: Certificate Handshake: ServerHelloDone Handshake: ClientKeyExchange ChangeCipherSpec Handshake:Finished ChangeCipherSpec Handshake:Finished
ServerHello • どの暗号スイートを選ん だか送る • 鍵生成用にランダムな 32 バイトの値を送る (server_random) クライアント
サーバ Handshake: ClientHello Handshake: ServerHello データ転送 Handshake: Certificate Handshake: ServerHelloDone Handshake: ClientKeyExchange ChangeCipherSpec Handshake:Finished ChangeCipherSpec Handshake:Finished
Certificate • 公開鍵を送信する クライアント サーバ Handshake: ClientHello Handshake: ServerHello データ転送
Handshake: Certificate Handshake: ServerHelloDone Handshake: ClientKeyExchange ChangeCipherSpec Handshake:Finished ChangeCipherSpec Handshake:Finished
ServerHelloDone • このフェーズのすべて送 信が完了したことを知ら せる • Certificate の後に送信で きるオプションがあるため クライアント
サーバ Handshake: ClientHello Handshake: ServerHello データ転送 Handshake: Certificate Handshake: ServerHelloDone Handshake: ClientKeyExchange ChangeCipherSpec Handshake:Finished ChangeCipherSpec Handshake:Finished
ClientKeyExchange • Certificate で受け取った 公開鍵で暗号化した pre_master_secret と呼 ばれる鍵を送信する ※暗号化ではなく、鍵交換ア ルゴリズムでもよい
クライアント サーバ Handshake: ClientHello Handshake: ServerHello データ転送 Handshake: Certificate Handshake: ServerHelloDone Handshake: ClientKeyExchange ChangeCipherSpec Handshake:Finished ChangeCipherSpec Handshake:Finished
ChangeCipherSpec • 送信側の実装がネゴシ エート済みの別のアルゴ リズムと鍵の素材に切り 替えたことを通知 • 後続のメッセージからそ れらのアルゴリズムを使う ことを通知
クライアント サーバ Handshake: ClientHello Handshake: ServerHello データ転送 Handshake: Certificate Handshake: ServerHelloDone Handshake: ClientKeyExchange ChangeCipherSpec Handshake:Finished ChangeCipherSpec Handshake:Finished
Finished • ネゴシエートされた暗号 技術で暗号化される最初 の通信 • ハンドシェイクのメッセー ジのダイジェストを送信す る(改竄検知のため) クライアント
サーバ Handshake: ClientHello Handshake: ServerHello データ転送 Handshake: Certificate Handshake: ServerHelloDone Handshake: ClientKeyExchange ChangeCipherSpec Handshake:Finished ChangeCipherSpec Handshake:Finished
鍵の生成 • client_random, server_random, pre_master_secret を用い て master_secret を作る •
master_secret, client_ramdom, server_random を用いて共 通鍵暗号の共通鍵、 MAC 鍵を作成する ◦ これによって暗号通信が行われる!
まとめ
まとめ • SSL 通信の暗号方式は、共通鍵と公開鍵両方をつかうハイブ リッド方式を使っている • ハンドシェイクは実質 2 往復しかしていない(意外!) •
master_secret から共通鍵や MAC 鍵が作られている
もっと話したかったこと • サーバの公開鍵は本物であることを示す方法 • master_secret の作り方 • 暗号化、復号の計算コスト • ディジタル署名
参考文献
参考文献 • マスタリングTCP/IP 情報セキュリティ編 (齋藤孝道 著) 2013年 p15-16, p35-36, p55,
p58, p124 • マスタリングTCP/IP SSL/TLS編 (Eric Rescorla 著、齋藤 孝道 監訳、鬼頭 利之 監 訳、古森 貞 監訳) 2003年 p52-61, p75, p83-95 • 情報処理推進機構(IPA) PKI 関連技術情報, 2.2.4 公開鍵暗号方式の種類 2009/9/1 最終更新 (最終閲覧日: 2020/5/24) https://www.ipa.go.jp/security/pki/022.html