HTTPSとTLSの仕組みを徹底解説:ハンドシェイクと証明書

Security2026-10-30TryQuickToolBox

HTTPSが重要な理由(そして誤解されがちな理由)

ブラウザの鍵アイコンを見て、そのサイトが「安全」だと思ったことはありませんか?しかし、それは実際には何を意味するのでしょうか?HTTPSは単なる暗号化ではなく、アイデンティティ、完全性、そして信頼に関わるものです。多くの開発者はTLSをブラックボックスとして扱い、一度設定したら忘れてしまいます。その結果、設定ミス、証明書の期限切れ、脆弱な暗号スイートなどの問題が発生します。

この記事では、HTTPSとTLSが実際にどのように機能するかを、ハンドシェイクから証明書の検証まで分解して説明し、正しい設定方法を紹介します。無駄な話は抜きで、今日から適用できる実践的な知識をお届けします。

TLSハンドシェイク:最初のバイトが送られる前に何が起こるか

クライアント(ブラウザ)がHTTPSでサーバーに接続すると、TLSハンドシェイクが実行されます。これにより安全なチャネルが確立されます。以下は簡略化したバージョン(TLS 1.3)です:

  1. Client Hello: クライアントはサポートする暗号スイート、ランダム値、鍵共有(鍵交換用)を送信します。
  2. Server Hello: サーバーは暗号スイートを選択し、自身のランダム値と鍵共有を送信し、証明書チェーンを提示します。
  3. 認証: クライアントは信頼されたCAに対してサーバーの証明書を検証し、ホスト名をチェックします。
  4. 鍵導出: 双方がECDHE(楕円曲線ディフィー・ヘルマン一時鍵)を使用して共有秘密を計算します。
  5. Finished: 双方が暗号化された「Finished」メッセージを送信し、ハンドシェイクを確認します。

この後、アプリケーションデータは対称鍵で暗号化されます。TLS 1.3ではラウンドトリップが1回に削減され、レイテンシが改善されます。

鍵交換:ECDHE vs RSA

古いTLSバージョンではRSA鍵交換が使用されていましたが、これには前方秘匿性がありません。サーバーの秘密鍵が漏洩すると、過去のトラフィックが復号化される可能性があります。現代の設定ではECDHEを使用し、前方秘匿性を提供します。各セッションに固有の鍵が生成されます。

# 例:サポートされている鍵交換アルゴリズムを確認
openssl s_client -connect example.com:443 -cipher 'ECDHE'

証明書:信頼のアンカー

証明書は公開鍵をアイデンティティ(ドメイン名)に結び付けます。クライアントが信頼する認証局(CA)によって署名されています。ブラウザには信頼されたルートCAのストアが同梱されています。

サイトにアクセスすると、サーバーはチェーンを送信します:リーフ証明書(あなたのドメイン用)→ 中間CA → ルートCA。クライアントは信頼されたルートに至るまで各署名を検証します。

証明書の種類

証明書検証の手順

ブラウザは以下をチェックします:

いずれかのチェックが失敗すると警告が表示されます。本番環境ではこれらの警告を決して無視しないでください。

サーバーでのHTTPS設定

モダンなTLS設定を備えた典型的なNginxのHTTPS設定を見てみましょう。

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers off;

    # HSTS(慎重に使用)
    add_header Strict-Transport-Security "max-age=63072000" always;
}

注意点:

Let's Encryptでの証明書取得

Let's Encryptは無料のDV証明書を提供します。Certbotを使用して発行と更新を自動化します:

sudo certbot --nginx -d example.com -d www.example.com

CertbotはNginx設定を変更し、更新用のcronジョブを設定します。常に--dry-runで更新をテストしてください。

よくある落とし穴と回避方法

HTTPS設定のテスト

SSL Labsなどのオンラインツールやコマンドラインツールを使用して設定を確認します。

# 証明書の詳細を確認
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -text

# TLS 1.3のサポートをテスト
openssl s_client -connect example.com:443 -tls1_3

確認するポイント:

FAQ

TLSとSSLの違いは何ですか?

SSLはTLSの前身です。TLS 1.0は本質的にSSL 3.1でした。今日、「SSL」は口語的に使われることが多いですが、常にTLS 1.2または1.3を使用すべきです。

HTTPSに有料の証明書は必要ですか?

いいえ。Let's Encryptの無料DV証明書はすべての主要ブラウザで信頼されており、有料のものと同じ暗号化を提供します。有料証明書は保証とサポートを提供しますが、暗号化は同一です。

HTTPSはパフォーマンスにどのように影響しますか?

TLSはハンドシェイクによりレイテンシを追加しますが、TLS 1.3では1ラウンドトリップに削減されます。セッション再開とHTTP/2により、オーバーヘッドは最小限です。暗号化/復号化のコストは現代のCPUでは低いです。

サーバーのTLS設定を検査する準備はできましたか?Nginx Log Analyzerを使用して、異常なトラフィックパターンを特定し、HTTPS設定が期待通りに機能していることを確認してください。