3秒でわかる
ブラウザとサーバーの通信を暗号化する仕組み。盗み見・改ざん・なりすましを防ぐために使い、HTTPS の末尾の s はこの TLS が入っている印です。
もう少し詳しく
どういうものか
SSL/TLS は、ネットワークを流れるデータを暗号化して相手に届けるためのプロトコルです。先に生まれた SSL に深刻な脆弱性が見つかり、後継として TLS が作られました。いま実際に動いているのは TLS 1.2 と TLS 1.3 で、SSL 3.0 以前は主要なブラウザとサーバーですでに無効化されています。それでも証明書を「SSL 証明書」と呼ぶ習慣が残っているため、両方を並べて SSL/TLS と書かれます。
HTTP の上に TLS をかぶせたものが HTTPS です。TLS は HTTP 専用ではなく、メール送信の SMTP、データベース接続、gRPC など、TCP の上で動く通信なら同じ仕組みを載せられます。
なぜ必要か
暗号化のない HTTP では、通信が通り抜ける Wi-Fi ルーターやプロバイダの機器から中身がそのまま読めます。ログインフォームに入力したパスワードも、カード番号も、平文のまま流れていきます。
TLS が守るものは三つあります。中身を読まれない暗号化、途中で書き換えられたら気づける改ざん検知、そして相手が名乗ったとおりのサーバーかを確かめるサーバー認証です。三つ目を担うのが証明書で、暗号化するだけなら証明書は要りません。偽サイトと安全に暗号化して会話しても意味がないので、認証と暗号化がセットになっています。
具体例
# 証明書の発行者・対象ドメイン・有効期限を確認する
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
| openssl x509 -noout -issuer -subject -dates
# 実際にネゴシエートされた TLS のバージョンを見る
curl -sI https://example.com -o /dev/null -w '%{http_version}\n'つまずきやすいところ
一番多い事故は証明書の期限切れです。無料の証明書は有効期間が短いので、自動更新の設定が止まっていないかを監視に入れておきます。
次に多いのが中間証明書の付け忘れです。ブラウザでは問題なく開けるのに、curl や Java のクライアントから叩くと検証エラーで落ちる、という形で出ます。ブラウザは過去に見た中間証明書を補完してくれるため、サーバーが証明書チェーンを送っていないことに気づきにくいのが厄介です。
もう一つ、開発中に自己署名証明書の警告を消したくて検証を無効にするコードを書き、そのまま本番へ持ち込むケースがあります。検証を切った時点で相手が本物かを確かめる工程が消えるため、暗号化していても中間者攻撃を素通しします。
似た用語との違い
| 用語 | 何をするもの |
|---|---|
| SSL/TLS | 通信そのものを暗号化・認証するプロトコル |
| HTTPS | HTTP を TLS の上で流したもの。TLS の使い道の一つ |
| SSH | サーバーへリモートログインするための別プロトコル。暗号化はするが TLS は使わない |
| 証明書 | ドメインの持ち主であることを第三者が保証する電子的な身分証 |
覚え方
鍵と身分証の二点セットだと覚えます。鍵で中身を隠すのが暗号化、身分証で相手を確かめるのが証明書です。