最近ふとSSL/TLSの仕組みについて知りたくなったので、「プロフェッショナルSSL/TLS」を読んだ。
かなりいろんな話題を網羅していて、かつ具体的な設定例なども書かれていて良かった。TLSに関する仕事をするときや、SSL/TLSやHTTPS周りで何回かハマったことがあるなら非常にお勧めできる。
仕組みを理解したいなら1章 SSL/TLSと暗号技術・2章 プロトコル・3章 公開鍵基盤が参考になった。実運用なら8章 デプロイ・9章 パフォーマンス最適化・16章 Nginxの設定あたりが参考になりそう。またTLS周りでハマった時のトラブルシューティングには12章のOpenSSLによるテストが使えるだろう。
ただ最新のTLS 1.3に関してはそこまで多く言及はなかった(電子書籍版の巻末の付録のみ)ので、これについては別書籍や別資料で学ぶ必要があるだろう。
読書メモ
* 暗号は大きくストリーム暗号化方式とブロック暗号化方式の2種類 7 * 安全に通信できる要件(機密性、完全性、真正性)を満たす最小構成 14 * 共通鍵暗号化によるデータ暗号化で機密性 * 改竄防止のためのハッシュ鍵によるMAC計算 * 抜き取ったり送り直したりできないようにメッセージに連番をつけてMACの計算に入れる * 会話の最後に特別なメッセージを送り、勝手に中断されないように * 公開鍵暗号化方式を使ってお互いを認証し、鍵交換アルゴリズムで共通鍵を交換 * トランスポート層に対する攻撃は大半は中間者攻撃 17 * RSAでの鍵交換をしてしまうと前方秘匿性(PFS)がない。前方秘匿性があるものを利用し、いずれ鍵が漏れても復号できないようにしておくこと 20 * プロトコル 24 * Recordプロトコルがコンテナ * Handshakeプロトコル * 大まかに三つ * 1. サーバ認証を伴うフルハンドシェイク * 2. 前回のセッションを再開する場合の、一部のメッセージを省略したハンドシェイク * 3. クライアントとサーバの認証を伴うハンドシェイク * Application Dataプロトコル 45 * Alertプロトコル 45 * 証明書は同じファイル内で複数内容が入っていて良い 30 * 先頭はサーバ証明書、その後ろに中間証明書が順番に続く。ルート証明書は省くべき * 接続したいサーバの名前はクライアントでserver_name拡張により指定できる。これにより仮想サーバに安全に接続できる 55 * 証明書とは、公開鍵・公開鍵に紐づけられた主体に関する情報・証明書を発行した主体のディジタル署名の3セット 64 * Name Constraints拡張を使い、例えば自分で所有しているドメイン名に対してのみ証明書を発行できる下位のCAを企業が持てる 66 * インターネットPKIの証明書の仕組みは失効がなかなか難しい 75 * 遅延が10日間程度(中間CA証明書は12ヶ月)あり得る * ソフトフェイルポリシーにより、失効情報の取得エラーの場合、そのまま証明書を使い続ける * HSTSを使うことで、ユーザー側のミスやページの問題があっても強制的に安全なリソースを取得させられる 137 * CSPを使うことで、安全でないリソースをブロックできる 137 * TLSサーバを安全に運用環境にデプロイするためのアドバイスまとめ 251 ☆ * こういうタスクがある時は全部読みましょう * TLSサーバでパフォーマンスを出すために考えること 271 ☆ * こういうタスクがある時は全部読みましょう * TLSに対して特に大きな影響があるのはレイテンシ。ハンドシェイクに時間がかかってしまう * TLSにおける鍵交換アルゴリズムのパフォーマンス比較 280 * HSTSデプロイのためのチェックリスト 301 * パスワード保護された鍵を本番環境で使っても安全性が大きく向上することはない。プログラムのメモリ上では保護されない状態になるため 328 * 証明書の拡張で属性がcriticalになっているものは、証明書を利用する全てのソフトウェアが意味を理解していなければならない 334 * openssl speedを使うと速度検証ができる 350 * プライベートCAの作り方 352 ☆ * ルートCAを作る * 下位CAを作る * OCSPなど失効エンドポイントを作る * Nginxの設定 469 ☆ * 0-RTTはリプレイ攻撃に脆弱である・場合によってPFSがないという問題はあるので、使い方に気をつける必要がある 518