Slide 1

Slide 1 text

Apache 2.4 新機能 “SSL編” at 2012/3/29 Webサーバ勉強会#5 @nappa

Slide 2

Slide 2 text

SSL (TLS) のおさらい • 認証、改ざん検出、暗号化を提供する • 複数のアルゴリズムの組み合わせでできて いる – 公開鍵暗号 – 共通鍵暗号 – MAC (ハッシュとか) • 公開鍵暗号は重い! – まず公開鍵暗号で、共通鍵暗号の鍵を配送する • これが TLS Handshake

Slide 3

Slide 3 text

初回のHandshake Client Server ClientHello --------> (SessionID=xxx) ServerHello Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data

Slide 4

Slide 4 text

初回のHandshake Client Server ClientHello --------> (SessionID=xxx) ServerHello Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] Finished --------> [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data こいつらが重い!

Slide 5

Slide 5 text

2回目以降は省略して、こうしたい Client Server =========================================================== ClientHello --------> ServerHello [ChangeCipherSpec] <-------- Finished [ChangeCipherSpec] Finished --------> Application Data <-------> Application Data

Slide 6

Slide 6 text

省略のための方法 • Session Cache – 古くからある方法 • Session Ticket – RFC5077 – 最近できた方法

Slide 7

Slide 7 text

どのくらい軽くなるの? • http://wizardbible.org/45/45.txt 読むべし – Session Cache の有無で比較している記事 – 「非常に大きな効果があり、5倍~22倍近く速く なっている。」

Slide 8

Slide 8 text

SessionCache の仕組み Client Server ClientHello --------> (SessionID=xxx) ServerHello Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] Finished --------> [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data ここで、Handshake 結果を Server / Client 両方で保存

Slide 9

Slide 9 text

2回目以降は省略して、こうしたい Client Server =========================================================== ClientHello --------> (SessionID=xxx) ServerHello [ChangeCipherSpec] <-------- Finished [ChangeCipherSpec] Finished --------> Application Data <-------> Application Data (意: 以前アクセスした者ですが……)

Slide 10

Slide 10 text

問題点その1 • サーバが複数台あるとき困るよ! – キャッシュデータをサーバ間で共有しないといけ ない ('A`) – Apache 2.2: distcache を使う • えーすでに memcached 動かしてるのに…… – Apache 2.4 だと memcached 使えるよ(キリッ

Slide 11

Slide 11 text

Session Cache の設定方法 1. memcached を立てる (Kyoto Tycoon とか repcacned でもOK) 2. httpd.conf にこう書いて、反映 3. 確認 LoadModule socache_memcache_module ¥ modules/mod_socache_memcache.so SSLSessionCache memcache:192.168.0.1,192.168.0.2

Slide 12

Slide 12 text

Session Cache の動作確認 • Wiresharkで TLS Client Hello を見る 同一ブラウザからのアクセスの Session ID が使い回されていればOK (Session ID がアクセスごとに変わる場合、 設定ミスしてる)

Slide 13

Slide 13 text

問題点その2 • 「そもそもサーバ側に保存したくないよ!」 – SSLSessionTicket で解決 (キリッ

Slide 14

Slide 14 text

Session Ticket の概要 • サーバ側で保存するべきものを、 暗号化してクライアントに渡し、 クライアント側で保存してもらう • 次回 Handshake 時にそれをサーバ側に送り、 サーバ側で復号化

Slide 15

Slide 15 text

Session Ticket 対応時の初回 Handshake Client Server ClientHello (empty SessionTicket extension)--------> ServerHello (empty SessionTicket extension) Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] Finished --------> NewSessionTicket [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data

Slide 16

Slide 16 text

Session Ticket 対応時の初回 Handshake Client Server ClientHello (empty SessionTicket extension)--------> ServerHello (empty SessionTicket extension) Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] Finished --------> NewSessionTicket [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data (意: SessionTicketモラッテヤルゼ) (意: SessionTicketアゲヨウ) (意: SessionTicketダヨ)

Slide 17

Slide 17 text

Session Ticket の中身 0000 - 57 48 5e db be 56 64 70-2d 07 df 2c a2 95 80 8f WH^..Vdp-..,.... 0010 - 93 f4 d8 e3 b0 4d 39 fb-1f 45 7e 08 0e 4d 89 66 .....M9..E~..M.f 0020 - 30 78 46 81 44 e4 7c b9-f6 7b 10 26 bf 0b dc 71 0xF.D.|..{.&...q 0030 - c5 af b1 e8 32 14 36 8c-0c 89 c2 e9 9d 7b 9b 27 ....2.6......{.' 0040 - 99 33 c8 96 a4 61 eb 4b-f1 5b 3c 10 65 ab ab b5 .3...a.K.[<.e... 0050 - 47 88 89 7c ed 09 00 8d-76 b7 7c 71 4a 65 a2 46 G..|....v.|qJe.F 0060 - 53 30 95 d0 fb fd 45 0d-bc ac 48 1d 8e 0d fd 0e S0....E...H..... 0070 - 71 95 1b 58 12 54 94 f4-ff aa 74 a2 dc 80 65 66 q..X.T....t...ef 0080 - 7d cf 19 15 6b 97 23 d9-60 ae 5a e4 7a 7c c3 4a }...k.#.`.Z.z|.J 0090 - fb f2 a8 e7 df 6d b9 68-22 a3 5b b4 38 3c 95 73 .....m.h".[.8<.s 00a0 - 3c ac 9c d6 04 df 15 ae-8e 64 0d 2e 3a f1 b2 c3 <........d..:... 00b0 - 85 63 19 a5 c7 e9 3d 63-a2 18 12 ea 62 c0 d3 3f .c....=c....b..? = 暗号化されていて、何が入っているかは分からない (サーバ側でしか解読できない)

Slide 18

Slide 18 text

2回目以降…… Client Server ClientHello (SessionTicket extension) --------> ServerHello (empty SessionTicket extension) NewSessionTicket [ChangeCipherSpec] <-------- Finished [ChangeCipherSpec] Finished --------> Application Data <-------> Application Data

Slide 19

Slide 19 text

2回目以降…… Client Server ClientHello (SessionTicket extension) --------> ServerHello (empty SessionTicket extension) NewSessionTicket [ChangeCipherSpec] <-------- Finished [ChangeCipherSpec] Finished --------> Application Data <-------> Application Data 意: ホレ, Session Ticket ダゼ 意: ヨッシャ, ツギハコノ Session Ticket デタノム

Slide 20

Slide 20 text

Session Ticket を使う方法 1. まず鍵ファイルを生成 2. 鍵を全サーバにコピー 3. httpd.conf の SSLSessionTicketKeyFile ディレク ティブで鍵ファイルを指定し、反映 4. 確認 dd if=/dev/random of=/path/to/file.tkey bs=1 count=4 SSLSessionTicketKeyFile /path/to/file.tkey

Slide 21

Slide 21 text

Session Ticketの動作確認 • まず Session ID を確認 同一ブラウザからのアクセスの Session ID が使い回されていればOK (Session ID がアクセスごとに変わる場合、 設定ミスしてる)

Slide 22

Slide 22 text

次にSessionTicket を確認 • Firefox で 長さが0以上ならOK

Slide 23

Slide 23 text

ほか確認方法 • openssl s_client コマンドが確実 • ※要 OpenSSL 1.0.1 • openssl s_client コマンドの使い方を覚えてお くといろいろ幸せになれるよ openssl s_client –connect 192.168.0.1:443

Slide 24

Slide 24 text

OpenSSL の出力 : SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384 Session-ID: B7028F0D7D87D25E1C8DAF18A3F5A2A35DA9E30B6BB02C22F9BDC6AB961D307C Session-ID-ctx: Master-Key: 21810A476AA7DA06388B7FA0C68963600514086F835A623E3952B6F89529C4C2428FF8D5E3E839D95A47BE5E5669D06C Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: 0000 - 57 48 5e db be 56 64 70-2d 07 df 2c a2 95 80 8f WH^..Vdp-..,.... 0010 - de 11 c3 61 f1 cd d7 6a-19 8d e3 b2 2d 59 b4 56 ...a...j....-Y.V 0020 - 09 1b 4b 0b 77 f0 36 b5-4b 11 d7 10 44 52 ae 75 ..K.w.6.K...DR.u 0030 - 44 00 7d b2 c0 62 e8 d9-88 d2 86 e5 c3 c6 27 f2 D.}..b........'. 0040 - 19 72 63 fc b9 6d 3b 8d-02 48 ef a5 10 94 96 f9 .rc..m;..H...... 0050 - 07 1e bd 90 7a 7b 64 81-e7 23 d4 bd 70 5e 1b f2 ....z{d..#..p^.. 0060 - 5c 18 c5 c0 a3 0a cb 5d-ce 13 0a d7 e2 82 70 34 ¥......]......p4 0070 - a9 c6 e4 fe 9e 84 59 6f-84 61 84 3e 4c ad b7 d9 ......Yo.a.>L... 0080 - f9 4a c6 c6 47 55 0f 0f-59 54 81 bb aa 9a 4c 01 .J..GU..YT....L. 0090 - 2b 71 87 c2 2e 75 8a f8-38 8e 9f 0d 1e 9f 84 dc +q...u..8....... 00a0 - 3c 31 20 d9 0f 41 25 74-e8 f6 af 05 33 09 f2 b3 <1 ..A%t....3... 00b0 - 83 21 19 38 ad 70 06 a4-46 b6 65 43 4a 12 54 71 .!.8.p..F.eCJ.Tq Compression: 1 (zlib compression) Start Time: 1333014639

Slide 25

Slide 25 text

おしまい