Apache 2.4 新機能 “SSL編”

at 2012/3/29 Webサーバ勉強会#5
             @nappa
SSL (TLS) のおさらい
• 認証、改ざん検出、暗号化を提供する
• 複数のアルゴリズムの組み合わせででき
  ている
 – 公開鍵暗号
 – 共通鍵暗号
 – MAC (ハッシュとか)
• 公開鍵暗号は重い!
 – まず公開鍵暗号で、共通鍵暗号の鍵を配送す
   る
  • これが TLS Handshake
初回のHandshake
Client                                        Server

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

ClientHello           -------->
(SessionID=xxx)
                                          ServerHello
                                         Certificate*
                                   ServerKeyExchange*
                                  CertificateRequest*
                      <--------       ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished              -------->
                                   [ChangeCipherSpec]
                      <--------              Finished
Application Data      <------->      Application Data



                     こいつらが重い!
2回目以降は省略して、こうし
        たい
Client                                             Server
===========================================================
ClientHello                 -------->
                                               ServerHello
                                        [ChangeCipherSpec]
                            <--------             Finished
[ChangeCipherSpec]
Finished                    -------->
Application Data            <------->    Application Data
省略のための方法
• Session Cache
  – 古くからある方法


• Session Ticket
  – RFC5077
  – 最近できた方法
どのくらい軽くなるの?
• http://wizardbible.org/45/45.txt 読むべし
  – Session Cache の有無で比較している記事
  – 「非常に大きな効果があり、5倍~22倍近く速
    くなっている。」
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 両方で保存
2回目以降は省略して、こうし
         たい
 Client                                             Server
 ===========================================================
 ClientHello                 -------->
 (SessionID=xxx)
                                                ServerHello
(意: 以前アクセスした者ですが……)                      [ChangeCipherSpec]
                             <--------             Finished
 [ChangeCipherSpec]
 Finished                    -------->
 Application Data            <------->    Application Data
問題点その1
• サーバが複数台あるとき困るよ!
 – キャッシュデータをサーバ間で共有しないと
   いけない ('A`)

 – Apache 2.2: distcache を使う
   •   えーすでに memcached 動かしてるのに……


 – Apache 2.4 だと memcached 使えるよ(キリッ
Session Cache の設定方法
1. memcached を立てる (Kyoto Tycoon とか
   repcacned でもOK)

2. httpd.conf にこう書いて、反映
  LoadModule socache_memcache_module ¥
             modules/mod_socache_memcache.so

  SSLSessionCache memcache:192.168.0.1,192.168.0.2


3. 確認
Session Cache の動作確認
• Wiresharkで TLS Client Hello を見る




                   同一ブラウザからのアクセスの
                 Session ID が使い回されていればOK
               (Session ID がアクセスごとに変わる場
                         合、設定ミスしてる)
問題点その2
• 「そもそもサーバ側に保存したくない
  よ!」
 – SSLSessionTicket で解決 (キリッ
Session Ticket の概要
• サーバ側で保存するべきものを、
   暗号化してクライアントに渡し、
    クライアント側で保存してもらう

• 次回 Handshake 時にそれをサーバ側に送り、
  サーバ側で復号化
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
Session Ticket 対応時の初回
                     Handshake
  Client                                                  Server

  ClientHello
  (empty SessionTicket extension)-------->
                                                 ServerHello
                             (empty SessionTicket extension)
(意: SessionTicketモラッテヤルゼ)
                                                Certificate*
                                          ServerKeyExchange*
                                         CertificateRequest*
                              <--------      ServerHelloDone
  Certificate*
  ClientKeyExchange                                      (意: SessionTicketアゲヨウ)
  CertificateVerify*
  [ChangeCipherSpec]
  Finished                    -------->
                                               NewSessionTicket
                                             [ChangeCipherSpec]
                              <--------                Finished
  Application Data            <------->
                                                           (意: SessionTicketダヨ)
                                               Application Data
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..?



                 = 暗号化されていて、何が入っているかは分からない
                  (サーバ側でしか解読できない)
2回目以降……
Client                                               Server
ClientHello
(SessionTicket extension)    -------->
                                                ServerHello
                            (empty SessionTicket extension)
                                           NewSessionTicket
                                         [ChangeCipherSpec]
                             <--------             Finished
[ChangeCipherSpec]
Finished                    -------->
Application Data            <------->      Application Data
2回目以降……
Client                                                     Server
ClientHello
(SessionTicket extension)     -------->
意: ホレ, Session Ticket ダゼ                       ServerHello
                             (empty SessionTicket extension)
                                            NewSessionTicket
                                          [ChangeCipherSpec]
                              <--------             Finished
[ChangeCipherSpec]                       意: ヨッシャ, ツギハコノ Session Ticket デタノム
Finished                     -------->
Application Data             <------->        Application Data
Session Ticket を使う方法
1. まず鍵ファイルを生成
   dd if=/dev/random of=/path/to/file.tkey bs=1 count=4



2. 鍵を全サーバにコピー
3. httpd.conf の SSLSessionTicketKeyFile ディレク
   ティブで鍵ファイルを指定し、反映
   SSLSessionTicketKeyFile /path/to/file.tkey


4. 確認
Session Ticketの動作確認
• まず Session ID を確認




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




                長さが0以上ならOK
ほか確認方法
• openssl s_client コマンドが確実
    openssl s_client –connect 192.168.0.1:443



• ※要 OpenSSL 1.0.1
• openssl s_client コマンドの使い方を覚えて
  おくといろいろ幸せになれるよ
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)
おしまい

Apache 2.4 新機能 “SSL編”

  • 1.
    Apache 2.4 新機能“SSL編” at 2012/3/29 Webサーバ勉強会#5 @nappa
  • 2.
    SSL (TLS) のおさらい •認証、改ざん検出、暗号化を提供する • 複数のアルゴリズムの組み合わせででき ている – 公開鍵暗号 – 共通鍵暗号 – MAC (ハッシュとか) • 公開鍵暗号は重い! – まず公開鍵暗号で、共通鍵暗号の鍵を配送す る • これが TLS Handshake
  • 3.
    初回のHandshake Client Server ClientHello --------> (SessionID=xxx) ServerHello Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data
  • 4.
    初回のHandshake Client Server ClientHello --------> (SessionID=xxx) ServerHello Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] Finished --------> [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data こいつらが重い!
  • 5.
    2回目以降は省略して、こうし たい Client Server =========================================================== ClientHello --------> ServerHello [ChangeCipherSpec] <-------- Finished [ChangeCipherSpec] Finished --------> Application Data <-------> Application Data
  • 6.
    省略のための方法 • Session Cache – 古くからある方法 • Session Ticket – RFC5077 – 最近できた方法
  • 7.
    どのくらい軽くなるの? • http://wizardbible.org/45/45.txt 読むべし – Session Cache の有無で比較している記事 – 「非常に大きな効果があり、5倍~22倍近く速 くなっている。」
  • 8.
    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 両方で保存
  • 9.
    2回目以降は省略して、こうし たい Client Server =========================================================== ClientHello --------> (SessionID=xxx) ServerHello (意: 以前アクセスした者ですが……) [ChangeCipherSpec] <-------- Finished [ChangeCipherSpec] Finished --------> Application Data <-------> Application Data
  • 10.
    問題点その1 • サーバが複数台あるとき困るよ! –キャッシュデータをサーバ間で共有しないと いけない ('A`) – Apache 2.2: distcache を使う • えーすでに memcached 動かしてるのに…… – Apache 2.4 だと memcached 使えるよ(キリッ
  • 11.
    Session Cache の設定方法 1.memcached を立てる (Kyoto Tycoon とか repcacned でもOK) 2. httpd.conf にこう書いて、反映 LoadModule socache_memcache_module ¥ modules/mod_socache_memcache.so SSLSessionCache memcache:192.168.0.1,192.168.0.2 3. 確認
  • 12.
    Session Cache の動作確認 •Wiresharkで TLS Client Hello を見る 同一ブラウザからのアクセスの Session ID が使い回されていればOK (Session ID がアクセスごとに変わる場 合、設定ミスしてる)
  • 13.
    問題点その2 • 「そもそもサーバ側に保存したくない よ!」 – SSLSessionTicket で解決 (キリッ
  • 14.
    Session Ticket の概要 •サーバ側で保存するべきものを、 暗号化してクライアントに渡し、 クライアント側で保存してもらう • 次回 Handshake 時にそれをサーバ側に送り、 サーバ側で復号化
  • 15.
    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
  • 16.
    Session Ticket 対応時の初回 Handshake Client Server ClientHello (empty SessionTicket extension)--------> ServerHello (empty SessionTicket extension) (意: SessionTicketモラッテヤルゼ) Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange (意: SessionTicketアゲヨウ) CertificateVerify* [ChangeCipherSpec] Finished --------> NewSessionTicket [ChangeCipherSpec] <-------- Finished Application Data <-------> (意: SessionTicketダヨ) Application Data
  • 17.
    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..? = 暗号化されていて、何が入っているかは分からない (サーバ側でしか解読できない)
  • 18.
    2回目以降…… Client Server ClientHello (SessionTicket extension) --------> ServerHello (empty SessionTicket extension) NewSessionTicket [ChangeCipherSpec] <-------- Finished [ChangeCipherSpec] Finished --------> Application Data <-------> Application Data
  • 19.
    2回目以降…… Client Server ClientHello (SessionTicket extension) --------> 意: ホレ, Session Ticket ダゼ ServerHello (empty SessionTicket extension) NewSessionTicket [ChangeCipherSpec] <-------- Finished [ChangeCipherSpec] 意: ヨッシャ, ツギハコノ Session Ticket デタノム Finished --------> Application Data <-------> Application Data
  • 20.
    Session Ticket を使う方法 1.まず鍵ファイルを生成 dd if=/dev/random of=/path/to/file.tkey bs=1 count=4 2. 鍵を全サーバにコピー 3. httpd.conf の SSLSessionTicketKeyFile ディレク ティブで鍵ファイルを指定し、反映 SSLSessionTicketKeyFile /path/to/file.tkey 4. 確認
  • 21.
    Session Ticketの動作確認 • まずSession ID を確認 同一ブラウザからのアクセスの Session ID が使い回されていればOK (Session ID がアクセスごとに変わる場 合、設定ミスしてる)
  • 22.
    次にSessionTicket を確認 • Firefoxで 長さが0以上ならOK
  • 23.
    ほか確認方法 • openssl s_clientコマンドが確実 openssl s_client –connect 192.168.0.1:443 • ※要 OpenSSL 1.0.1 • openssl s_client コマンドの使い方を覚えて おくといろいろ幸せになれるよ
  • 24.
    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)
  • 25.