タイトル: HTTPS
SEOタイトル: HTTPS完全ガイド(TLS/SSL証明書/HSTS/HTTP3/Let's Encrypt)
| この記事の要点 |
|
HTTPS とは
HTTPS(Hypertext Transfer Protocol Secure)は、HTTP を TLS(Transport Layer Security)で暗号化したプロトコルです。通信内容は暗号化され、改ざんを検知でき、サーバの正当性が証明書で保証されます。標準ポートは 443。
HTTP: クライアント <─平文─> サーバ ポート 80
HTTPS: クライアント <─暗号化─> サーバ ポート 443
└ TLS による保護
TLS と SSL の関係
| プロトコル | 年 | 状態 |
|---|---|---|
| SSL 2.0 | 1995 | 廃止 |
| SSL 3.0 | 1996 | 廃止 (POODLE 攻撃) |
| TLS 1.0 | 1999 | 廃止 (PCI DSS で禁止) |
| TLS 1.1 | 2006 | 廃止 |
| TLS 1.2 | 2008 | ★ 標準 |
| TLS 1.3 | 2018 | ★ 推奨(新しい) |
「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.1 | TCP + TLS | テキストプロトコル、ヘッドオブラインブロッキング有 |
| HTTP/2 | TCP + TLS | バイナリ、多重化、ヘッダ圧縮 (HPACK) |
| HTTP/3 | UDP + 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。