HTTPS - 暗号化全般

暗号化全般 | IT用語集

HTTPSとは

HTTPS(HTTP Secure / HTTP over TLS)は、HTTPプロトコルをTLS(Transport Layer Security)で暗号化したセキュアな通信プロトコルです。ポート443を使用し、クライアント(ブラウザ)とサーバー間のすべての通信を暗号化します。HTTPSという名称自体は特定の1本のRFCで定義されているわけではなく、HTTPのセマンティクス(RFC 9110)とバージョンごとの通信方式(HTTP/1.1はRFC 9112、HTTP/2はRFC 9113、HTTP/3はRFC 9114)を、TLSのレコード層の上に載せて運用する構成全体を指す呼称です。アプリケーション層のHTTPと、トランスポート層(TCP、またはHTTP/3の場合はQUIC/UDP)の間にTLSという暗号化レイヤーを挟み込むイメージを持つと理解しやすくなります。

2014年のHTTPS Everywhere運動以降、GoogleはHTTPSをSEOランキング要因に追加し、現在ではほぼすべてのWebサイトがHTTPSを使用しています。Let's Encryptの登場により、無料でTLS証明書を取得できるようになったことも普及を後押ししました。ブラウザ側の統計でも、読み込まれるページの大半がHTTPS経由であるとされ、HTTPのみのサイトはChromeやFirefoxで「保護されていない通信」という警告表示の対象になります。

仕組み・詳細解説

HTTPSの安全性は、大きく分けて「①最初に安全な鍵を共有する(ハンドシェイク)」「②共有した鍵で実際のデータを暗号化する」「③相手が本物のサーバーであることを検証する」という3つの仕組みの組み合わせで成り立っています。それぞれを分解して見ていきます。

TLSハンドシェイクの流れ

現在主流のTLS 1.3(RFC 8446で規定)では、以下のような1往復(1-RTT)でハンドシェイクが完了します。TLS 1.2までは2往復(2-RTT)を要していたため、TLS 1.3への移行は接続確立の遅延短縮にも直結します。

  1. ClientHello:クライアントが対応可能な暗号スイート、TLSバージョン、鍵共有用の公開値(key_share)を提示
  2. ServerHello:サーバーが暗号スイートを選択し、自身の鍵共有値、サーバー証明書、署名を返送
  3. 鍵導出:双方がECDHE(後述)で得た共有シークレットから、HKDFというアルゴリズムでセッション鍵を導出
  4. Finished:双方がハンドシェイク内容が改ざんされていないことを確認するメッセージを交換し、以降のHTTPデータ本体はこのセッション鍵で暗号化される

さらにTLS 1.3では、以前に接続したサーバーとの再接続時にPSK(Pre-Shared Key)を使った0-RTT(往復なしでの初回データ送信)にも対応していますが、リプレイ攻撃のリスクがあるため冪等なリクエストに限定するなどの注意が実装上必要です。

鍵交換とPerfect Forward Secrecy

鍵交換には主にECDHE(Elliptic Curve Diffie-Hellman Ephemeral)が使われます。ECDHEは通信のたびに一時的な鍵ペアを生成するため、仮に後日サーバーの長期秘密鍵(証明書の秘密鍵)が漏洩したとしても、過去に記録・傍受された通信を復号することはできません。この性質をPerfect Forward Secrecy(PFS、完全前方秘匿性)と呼びます。TLS 1.3では鍵交換方式がECDHE(および実験的なPQC併用方式)に一本化され、PFSを持たない静的RSA鍵交換は廃止されました。詳細はPerfect Forward Secrecyの項目も参照してください。

対称鍵暗号によるデータ転送

ハンドシェイクが完了すると、実際のHTTPリクエスト・レスポンスはAEAD(Authenticated Encryption with Associated Data)と呼ばれる方式の対称鍵暗号でやり取りされます。代表的な暗号はAES-128-GCM、AES-256-GCM、ChaCha20-Poly1305です。AEADは暗号化と改ざん検知(認証)を1つの演算でまとめて行うため、以前のCBCモード+別立てMAC(Encrypt-then-MACやMAC-then-Encrypt)の組み合わせで問題になっていたパディングオラクル攻撃(POODLE、Lucky13など)の心配がありません。ChaCha20-Poly1305はAES-NIのようなハードウェアアクセラレーションを持たないモバイル端末やIoT機器でも高速に動作するよう設計されており、Google製品を中心に採用が進みました。

証明書検証とトラストチェーン

ブラウザは受け取ったサーバー証明書(リーフ証明書)から、中間認証局(Intermediate CA)証明書、ルート認証局(Root CA)証明書へとたどる「トラストチェーン」を検証します。あわせて、有効期限、SAN(Subject Alternative Name)とアクセス先ホスト名の一致、失効情報(OCSPステープリング等)、Certificate Transparencyログへの記載有無がチェックされます。中間証明書の配布漏れはクライアントによって挙動が割れる典型的な設定ミスであり、後述のトラブル事例でも扱います。証明書の構造そのものについてはX.509、検証の連鎖については証明書チェーン、認証局の仕組みは認証局(CA)の項目で詳しく解説しています。

HTTPSのメリットとデメリット

メリット

  • 通信の暗号化:盗聴からデータを保護
  • データ完全性:改ざんを検知
  • 認証:正しいサーバーと通信していることを保証
  • SEO向上:GoogleがHTTPSを優遇
  • 信頼性:ブラウザの「鍵」アイコンでユーザーに安心感

デメリット・注意点

  • 処理オーバーヘッド:TLSハンドシェイクやAEAD暗号化にはCPUコストが発生します。ただしTLS 1.3のセッション再開機能や、現代CPUのAES-NIハードウェアアクセラレーションにより、実務上はほぼ無視できる水準まで軽減されています
  • 証明書のライフサイクル管理コスト:有効期限の監視と自動更新の仕組みが必須です。更新失敗はそのままサービス停止につながるため、監視体制が重要になります
  • SNIによる接続先情報の露出:ハンドシェイク中のSNI(Server Name Indication)で接続先ホスト名が平文で送られる場合があり、通信経路上の観測者にアクセス先が分かってしまう可能性があります。これを暗号化するEncrypted Client Hello(ECH)は一部のブラウザ・CDNで試験導入が進んでいる段階です
  • 企業ネットワークでの通信検査の複雑化:プロキシによるTLSインスペクションを行う環境では、証明書の再署名やピン留め(証明書ピンニング)との相性を事前に検討する必要があります

実装例:Nginxを用いたHTTPS設定

APIサーバーやWebアプリケーションを公開する際、HTTPSの設定は避けて通れません。以下はNginxでのHTTPS設定例です。

server {
    listen 80;
    server_name api.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name api.example.com;
    
    ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
    
    # セキュリティヘッダー
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "DENY" always;
    
    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

混同されやすい用語・類似技術との違い

HTTPSは周辺技術と名称が似ているため混同されがちです。実務でよく質問される違いを整理します。

用語 HTTPSとの関係・違い
SSL HTTPSが登場した当初に使われていた暗号化プロトコルの旧称。SSL 2.0/3.0は既知の脆弱性(POODLE攻撃等)により廃止済みで、現在は実質的にTLSに置き換わっています。「SSL証明書」という呼び方は今も広く使われますが、実体はTLS証明書です
TLS HTTPSが実際に使用している暗号化プロトコルそのもの。HTTPSは「HTTP+TLS」という組み合わせ全体を指す呼び名であり、TLSはメールの送信(SMTP over TLS)やVPNなど、HTTP以外の通信にも使われる汎用プロトコルです
HTTP/2・HTTP/3 HTTPのバージョンであり、暗号化の有無とは別軸の概念です。HTTP/1.1やHTTP/2は理論上は平文(HTTP)でも動作できますが、HTTP/3はQUIC上でTLS 1.3を必須としているため、「HTTP/3を使っている=常にHTTPS」という関係になります
mTLS(相互TLS認証) 通常のHTTPSはサーバー証明書のみを検証し、クライアント(ブラウザ)側は証明書を提示しません。mTLSはクライアント側にも証明書提示を要求し、双方向で認証を行う方式で、マイクロサービス間通信やゼロトラストネットワークのAPI認証で採用されます
認証局(CA) HTTPS自体はプロトコルであり、認証局はその中で使われる証明書を発行する第三者機関です。HTTPSの信頼性は、ブラウザ・OSが信頼するルート認証局のリストに依存しています

Let's Encryptによる無料証明書

Let's Encryptは、ACME(Automatic Certificate Management Environment、RFC 8555)というプロトコルを使って証明書の発行・更新を自動化する無料の認証局です。ドメイン所有権の確認方式には、Webサーバー上に検証用ファイルを設置するHTTP-01チャレンジと、DNSにTXTレコードを追加するDNS-01チャレンジがあり、ワイルドカード証明書(*.example.comのような形式)を取得する場合はDNS-01が必須になります。

# certbotのインストール(Ubuntu)
sudo apt install certbot python3-certbot-nginx

# 証明書の取得と自動設定
sudo certbot --nginx -d api.example.com

# 自動更新の確認
sudo certbot renew --dry-run

有効期間は90日と短く設計されており、これは万一秘密鍵が漏洩した場合の被害期間を短く抑える設計思想に基づいています。運用上はcertbotのタイマー(systemdタイマーやcron)による自動更新を前提とし、更新失敗を検知するアラートを別途仕込んでおくのが定石です。

HSTS(HTTP Strict Transport Security)

HSTSは、ブラウザに対してHTTPSのみを使用するよう強制するセキュリティ機構で、RFC 6797で規定されています。HTTPでの初回アクセス自体を悪用する中間者攻撃(SSL Stripping)を防ぐことが主目的です。

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

各ディレクティブの意味は次の通りです。max-ageはこの指示をブラウザが記憶する秒数(上記例は1年)、includeSubDomainsはサブドメインにも同じポリシーを適用すること、preloadはブラウザベンダーが管理するHSTSプリロードリスト(hstspreload.org)への登録を希望する意思表示です。プリロードリストに登録されると、そのドメインへの初回アクセスからHTTPでの通信自体が発生しなくなりますが、登録には全サブドメインでのHTTPS配信が前提条件となるため、登録前に社内外すべてのサブドメインの対応状況を確認しておく必要があります。

鍵長・アルゴリズムの推奨基準(2026年時点)

暗号アルゴリズムや鍵長の「安全な水準」は年々見直されています。NIST(米国国立標準技術研究所)はSP 800-57 Part 1やSP 800-131Aで、アルゴリズムごとの推奨強度と非推奨化のスケジュールを示しており、HTTPSサーバーの設定でもこれらの基準を参考にするのが実務上の定石です。

区分 非推奨・廃止済み 2026年時点の標準的な選択
鍵交換 静的RSA鍵交換、弱いDHEグループ ECDHE(楕円曲線のsecp256r1・X25519等)
対称暗号 RC4、3DES、CBCモード単体利用 AES-128-GCM/AES-256-GCM、ChaCha20-Poly1305(AEAD方式)
ハッシュ関数 MD5、SHA-1 SHA-256以上(SHA-2系列)
署名鍵長 RSA-1024以下 RSA-2048以上(新規発行は3072を推奨する場も増加)、ECDSA P-256、Ed25519

NISTの基準では、RSA-2048やECC P-256相当の「112ビット安全性」は2030年前後を境に非推奨方向に見直される見込みとされ、長期的にはRSA-3072やECC P-384相当の「128ビット安全性」への移行が推奨される流れにあります。新規に証明書やシステムを設計する際は、この移行スケジュールを見越して鍵長を選定しておくと、将来の再発行コストを抑えられます。あわせて、量子コンピュータによる将来的な脅威に備えた耐量子暗号(PQC)との併用(ハイブリッド鍵交換)も、CloudflareやGoogleのブラウザ実装で試験的に導入が進んでいます。TLS関連の推奨設定はRFC 9325(BCP 195、旧RFC 7525を置き換え)にもまとまっており、サーバー設定の見直し時に参照する価値があります。

トラブル事例と対策

Mixed Content警告

症状:HTTPSページ内でHTTPの画像・スクリプト・CSSを読み込んでおり、ブラウザのコンソールに警告が出る、または一部リソースがブロックされる

対策:すべてのリソースをHTTPSで配信するようURLを修正する。相対プロトコル(//example.com/...)や絶対HTTPS URLへの統一に加え、暫定策としてContent-Security-Policy: upgrade-insecure-requestsヘッダーを設定してブラウザ側に自動アップグレードさせる方法もあります。

中間証明書の欠落によるチェーンエラー

症状:主要ブラウザでは正常に表示されるのに、curlやモバイルアプリ、一部の古いクライアントで証明書検証エラーになる

対策:サーバーにはリーフ証明書だけでなく中間証明書を連結したfullchain.pemを設定する。SSL Labsのサーバーテスト等でチェーンの完全性を確認しておくと、クライアント側のキャッシュ済みルートストアに依存する見落としを事前に防げます。

証明書の有効期限切れによるサービス停止

症状:Let's Encryptの90日更新サイクルで自動更新のcronやsystemdタイマーが何らかの理由(設定変更、権限エラー等)で失敗し、期限切れ後にサイト全体がアクセス不可になる

対策:更新コマンド自体の成否だけでなく、証明書の実際の有効期限を外部から定期的にチェックする監視(有効期限が一定日数を切ったらアラート)を、更新処理とは独立した仕組みとして用意しておく。

2025〜2026年の最新動向

  • HTTP/3(QUIC)の普及:Chrome、Firefox、SafariすべてがHTTP/3対応。主要サービスの多くがHTTP/3を有効化
  • TLS 1.3の完全移行:TLS 1.0/1.1は主要ブラウザで無効化済み。TLS 1.2→1.3への移行が加速
  • 証明書の短期化:Apple等がSSL証明書の有効期間を47日に短縮する方針を提案(2026年〜)
  • 耐量子TLS:Cloudflare・Google等が量子コンピュータ対応のPQC鍵交換の試験を実施
  • Encrypted Client Hello(ECH):SNIによる接続先ホスト名の露出を防ぐ仕組みが一部ブラウザ・CDNで試験導入段階にある
  • Certificate Transparencyの強化:主要ブラウザがCT証跡のないTLS証明書を信頼しない運用の厳格化を継続

よくある質問(FAQ)

Q. HTTPSを使うだけでサイトは安全ですか?

HTTPSは通信の暗号化を保証しますが、それだけでは不十分です。XSS、SQLインジェクション、CSRF等の脆弱性はHTTPSとは別に対策が必要です。HTTPSはあくまで「通信の安全性」であり、「アプリケーションの安全性」は別の話です。

Q. Let's Encryptの証明書は商用利用できますか?

はい、完全に無料で商用利用可能です。ただし、有効期間が90日と短いため自動更新設定が必要です。CertbotやACMEクライアントを使ってcronやsystemdタイマーで自動更新することが推奨されます。

Q. HTTP/2とHTTP/3、HTTPSではどちらを使うべきですか?

クライアントとサーバーの双方が対応していれば、TLSのApplication-Layer Protocol Negotiation(ALPN)を通じて自動的に最適なバージョンがネゴシエーションされるため、開発者が明示的に選択する場面はあまりありません。実務上はHTTP/3対応のCDN(Cloudflare、Google Cloud CDN等)を利用しつつ、未対応クライアント向けにHTTP/2・HTTP/1.1へのフォールバックを維持しておくのが一般的な構成です。

Q. 自己署名証明書とLet's Encrypt証明書はどう違いますか?

自己署名証明書は自分自身で発行するため無料で即座に作成できますが、ブラウザやOSの信頼済みルートストアに含まれておらず、アクセス時に警告が表示されます。社内の検証環境やmTLSにおけるクライアント証明書の発行元としては実務上よく使われますが、一般公開するWebサイトでは、信頼された認証局(Let's Encrypt等)が発行した証明書を使うのが定石です。

関連用語

外部リンク・参考資料

📝 関連ブログ記事

【2026年最新】OpenSSLの深刻な問題とは?

HTTPS導入のご相談