2.

HTTPSとは|TLS/SSL証明書・HSTS・HTTP/3・Let's Encrypt

編集
この記事の要点
  • HTTPS = HTTP over TLS。HTTP 通信を TLS で暗号化したプロトコル。標準ポート 443
  • TLS は 暗号化 (Confidentiality) + 改ざん検知 (Integrity) + サーバ認証 (Authenticity) を提供
  • サーバ証明書は CA (Let"s Encrypt / DigiCert / Sectigo 等) が発行。ブラウザはルート CA を信頼
  • TLS 1.2 がデファクト、TLS 1.3 で高速化(1-RTT / 0-RTT)+ 古い暗号 削除
  • HSTS ヘッダで「以後 HTTPS のみ」をブラウザに記憶させ、SSL Strip 攻撃を防ぐ
  • Certificate Transparency (CT) ログで不正発行を監視。Chrome は CT 必須
  • HTTP/3 (QUIC) は UDP + TLS 1.3 統合、ハンドシェイク短縮・ヘッドオブラインブロッキング解消

HTTPS とは

HTTPS(Hypertext Transfer Protocol Secure)は、HTTP を TLS(Transport Layer Security)で暗号化したプロトコルです。通信内容は暗号化され、改ざんを検知でき、サーバの正当性が証明書で保証されます。標準ポートは 443

HTTP:  クライアント <─平文─> サーバ          ポート 80
HTTPS: クライアント <─暗号化─> サーバ        ポート 443
                   └ TLS による保護

TLS と SSL の関係

プロトコル状態
SSL 2.01995廃止
SSL 3.01996廃止 (POODLE 攻撃)
TLS 1.01999廃止 (PCI DSS で禁止)
TLS 1.12006廃止
TLS 1.22008★ 標準
TLS 1.32018★ 推奨(新しい)

「SSL」という言葉は今も習慣的に使われますが、実態は TLS です(「SSL 証明書」も実質は TLS 証明書)。

TLS ハンドシェイク(概要)

TLS 1.2 (2-RTT)

クライアント                                      サーバ
    │  ClientHello (対応する暗号スイート列挙)      │
    ├─────────────────────────────────────────────▶│
    │  ServerHello (採用暗号) + 証明書             │
    │  + サーバ鍵交換パラメータ                    │
    │◀─────────────────────────────────────────────┤
    │  クライアント鍵交換 + Finished               │
    ├─────────────────────────────────────────────▶│
    │  Finished                                     │
    │◀─────────────────────────────────────────────┤
    │  暗号化された HTTP データ                    │
    │◀────────────────────────────────────────────▶│

TLS 1.3 (1-RTT, 0-RTT 再接続)

暗号スイートが整理され、Forward Secrecy が必須化。ハンドシェイクが1 往復で完了、再接続は0 往復でデータ送信できる(ただし 0-RTT はリプレイ攻撃に注意)。

証明書 (Certificate)

サーバの公開鍵と「このドメインの所有者であること」を認証局 (CA) が署名した電子文書。ブラウザは OS / ブラウザ内蔵のルート CA を信頼の起点として検証します。

検証レベル確認内容主用途
DV (Domain Validation)ドメイン所有のみ個人ブログ、Let"s Encrypt
OV (Organization Validation)組織実在企業サイト
EV (Extended Validation)組織を厳格審査金融、EC(緑バー表示は廃止)

Let"s Encrypt で無料 SSL

# Ubuntu / Nginx の例
sudo apt install -y certbot python3-certbot-nginx

# 取得 + Nginx 自動設定
sudo certbot --nginx -d example.com -d www.example.com

# 自動更新は systemd timer で既定設定済
sudo systemctl status certbot.timer

# 手動で更新テスト
sudo certbot renew --dry-run

# 取得済証明書一覧
sudo certbot certificates

Nginx 最小設定

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;

    # 推奨設定(TLS 1.2 / 1.3 のみ)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 1.1.1.1 8.8.8.8 valid=300s;

    # HSTS
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

    # その他セキュリティヘッダ
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
    add_header Referrer-Policy strict-origin-when-cross-origin;
}

# HTTP → HTTPS リダイレクト
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

HSTS(HTTP Strict Transport Security)

「このサイトは今後 HTTPS でしかアクセスしない」とブラウザに記憶させるレスポンスヘッダ。SSL Strip 攻撃や中間者攻撃を防ぎます。

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

意味:
  max-age=63072000        - 2 年間 HTTPS 強制
  includeSubDomains       - サブドメインも対象
  preload                 - HSTS Preload List 登録対象(hstspreload.org)

HSTS Preload List に登録すると、新規ユーザの初回アクセスから HTTPS が強制されます(ブラウザにハードコード)。

Certificate Transparency (CT)

証明書の発行を公開ログに記録する仕組み。不正発行(フィッシング用偽証明書など)を CT ログ監視で検知できます。Chrome は 2018 年から CT を必須化。

# 自社ドメインの証明書発行履歴を crt.sh で確認
curl -s 'https://crt.sh/?q=example.com&output=json' | jq

# 知らない発行があれば不正の可能性 → CA に異議申し立て

OCSP / OCSP Stapling

  • OCSP: 証明書の失効状態をリアルタイム問い合わせするプロトコル
  • クライアントから CA への直接問い合わせは遅延 + プライバシー問題
  • OCSP Stapling: サーバが定期的に取得した有効性応答を、TLS ハンドシェイクに同梱して配布する仕組み(高速 + プライバシー保護)

HTTP/2 と HTTP/3

バージョントランスポート特徴
HTTP/1.1TCP + TLSテキストプロトコル、ヘッドオブラインブロッキング有
HTTP/2TCP + TLSバイナリ、多重化、ヘッダ圧縮 (HPACK)
HTTP/3UDP + QUIC (TLS 1.3 統合)0-RTT、コネクション移行、L4 でロスト 1 ストリームのみ影響

SSL Labs テストで自社の品質確認

https://www.ssllabs.com/ssltest/analyze.html?d=example.com

評価ポイント:
- 証明書チェーン完全性
- プロトコル (TLS 1.0/1.1 は減点)
- 鍵交換 (Forward Secrecy)
- 暗号スイート強度
- HSTS / OCSP Stapling / CT 対応

A+ を目標に設定。F は即対応。

動作確認コマンド

# 証明書情報を表示
openssl s_client -connect example.com:443 -servername example.com < /dev/null \
  | openssl x509 -noout -text

# 有効期限だけ取得
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>&1 \
  | openssl x509 -noout -dates

# サポートするプロトコル一覧
nmap --script ssl-enum-ciphers -p 443 example.com

# テストで TLS バージョン指定
curl --tlsv1.2 https://example.com
curl --tlsv1.3 https://example.com

FAQ

Q: Let"s Encrypt は本番運用しても大丈夫?
A: 大手企業も多数採用していて問題ありません。注意点は3 ヶ月有効で自動更新必須、レート制限(同ドメイン週 50 件)あり。

Q: HTTPS にすると遅くなる?
A: TLS 1.3 + HTTP/2 / 3 ならむしろ高速。SEO 上も Google は HTTPS をランキング要因に。HTTP のままにする理由は無い。

Q: 自己署名証明書はどう違う?
A: CA の署名がないため、ブラウザが警告を出します。社内ツールや開発環境のみで使用、公開サービスでは絶対 NG。

編集
Post Share
子ページ
  1. 常時SSL化
  2. Let's Encryptを利用したSSL化 (nginx編)
同階層のページ
  1. HTTP
  2. HTTPS
  3. DNS
  4. FTP
  5. TFTP
  6. DHCP
  7. SMTP
  8. SNMP
  9. POP3
  10. Telnet
  11. NTP
  12. SSH

最近更新/作成されたページ