本記事ではHTTPS通信(SSL/TLS)がどのように暗号通信しているのかを図を交えながら説明したいと思います。
図は拙著「動かして学ぶ!Python Django開発入門」に掲載したものを本記事用に少し修正しています。
HTTPS(HyperText Transfer Protocol Secure)は、HTTP(HyperText Transfer Protocol)に暗号化プロセスを入れた通信規約のことです。その暗号化プロセスにはSSL(Secure Sockets Layer)とTLS(Transport Layer Security)があります。TLSはSSLの後継でSSLに重大な脆弱性が発見されてからはTLSが主流になっています。ただしSSLという名前が定着しているため、SSL証明書とだけ書いてあってもTLSを含んでいたりします(以下の説明でもSSLとだけ記述しています)。
HTTPS通信(SSL/TLS)の流れ
- クライアント(ブラウザ)からHTTPSリクエストがサーバー側に届くとSSLプロセスを開始。
- あらかじめサーバーに配置しておいたSSL証明書をクライアントに送信。SSL証明書はサーバーの正当性が認められれば認証局から発行されるもので、認証局の署名や公開鍵などが含まれている。
- ブラウザに最初から同梱されている世界的に認められた認証局(ルート認証局)のルート証明書とサーバーから送られてきたSSL証明書を照合する。一致すればサーバーから送られたSSL証明書が正当な認証局から発行されたものだと判断する。
SSL証明書を発行した認証局が上位の認証局から認証を受けている場合は、ルート認証局までの証明書がサーバーから送られる。そしてルート証明書から順に証明書を検証する手順となる。 - クライアント側で共通鍵を生成する。SSL証明書に同梱されていた公開鍵を使ってその共通鍵を暗号化しサーバーに送る。
- 認証局から発行された秘密鍵を使ってクライアントから送られてきた共通鍵を復号する。
- クライアントとサーバー双方で共通鍵を持つことができたので、あとは共通鍵を使ってデータを暗号化/復号化して通信する。
- ⑥と同じ。