目的
- 何となく証明書だのSSL/TLS通信だのに触れていて、ちゃんと仕組みがわかっているか怪しいので備忘としてアウトプット
- 社内環境がプロキシとの戦いなので、必須知識かもしれない
記事の概要
- サーバはどうやって証明書を手にするのか
- SSL/TLS通信の信頼性担保(SSLハンドシェイク)はどのように実現するのか
内容
SSL/TLS通信の概要
- SSL/TLSはTLSハンドシェイクによる信頼性担保、および暗号化された通信路の確保を指す
- HTTPをSSL/TLSで暗号化したものがHTTPSで、SSL/TLSとHTTPSは厳密には異なる概念
- サーバ(通信を受ける側)は認証局にまともだと認められた証である証明書を持っている
- クライアント(通信を送信する側)はその証明書の内容を見て、送信先サーバがまともかどうかを検証する
サーバはどうやって証明書を手にするのか
その対となる公開鍵情報を含む証明書を認証局に作ってもらうための依頼書を作る
SSL/TLS通信はどうやって確立されるのか
まずクライアントからClient Helloという通信がサーバ向けに発せられる。これにはクライアントが対応可能な通信方式を記載している。
Client Helloを元にサーバは通信方式を決定し、Server Helloで決定された通信方式を共有する。
続けてCertificateで証明書をクライアントに見せる。
クライアントはどの認証局を信じるかリストを持っていて、それを元に証明書を検証。OKだったらここでハンドシェイク成立。ハンドシェイク成立後、クライアントがランダムでセッション鍵を作る。これは後段で通信自体の暗号化で使われる。
双方のセッション鍵を元に通信自体を暗号化できる状態になる。この状態を持って「SSL終端」。HTTPS通信などはこの暗号化された通信路で実施される(厳密にはHTTPS以外にもSSL/TLSで暗号化される)
Appendix
- 証明書チェーン、mTLS通信、EV-SSL証明書についても気が向いたら書くかも