タイトル: SSL化
SEOタイトル: サイト SSL/TLS 化 (HTTPS) 完全ガイド(Let's Encrypt / ACM / Cloudflare / HSTS)
| この記事の要点 |
|
なぜ SSL/TLS 化(HTTPS 化)が必要か
- 通信内容の盗聴防止: パスワード / クレジットカード / Cookie の保護
- 改ざん検知: 中間者攻撃で広告挿入 / 偽ページ表示を防止
- SEO ランキング要因: Google は HTTPS をプラスシグナルと公言
- ブラウザ警告回避: Chrome / Firefox は HTTP サイトに「保護されていない通信」表示
- HTTP/2 / HTTP/3 利用条件: 主要ブラウザは HTTPS のみで HTTP/2 を有効化
- 新ブラウザ API の動作条件: Service Worker / WebRTC / Geolocation 等は HTTPS 必須
証明書の選択肢
| 種類 | 料金 | 用途 | 備考 |
|---|---|---|---|
| Let's Encrypt (DV) | 無料 | 個人 / 中小サイト | 90 日有効、自動更新前提 |
| AWS Certificate Manager | 無料 | ALB / CloudFront / API Gateway | EC2 直接利用は不可 |
| Cloudflare | 無料 | Cloudflare 経由のサイト全般 | Cloudflare がプロキシ |
| Google Trust Services | 無料 | GCP Load Balancer | Google Managed Certificate |
| 有料 DV 証明書(Sectigo / GeoTrust 等) | 年 ¥1,000~ | 企業 / 補償付き | 1〜2 年有効、サポート付 |
| OV 証明書 | 年 ¥3 万〜 | 組織実在証明 | 会社情報を証明書に |
| EV 証明書 | 年 ¥10 万〜 | 銀行・大手 EC | かつての緑バー、現代は廃止 |
パターン1: Let's Encrypt + Certbot(Nginx / Apache)
Linux サーバに直接 Web サーバを立てている場合の定番。
Ubuntu + Nginx の例
# Certbot インストール
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
# 証明書取得 + Nginx 設定自動反映
sudo certbot --nginx -d example.com -d www.example.com
# 対話形式で:
# - メールアドレス入力
# - 利用規約同意
# - HTTP → HTTPS リダイレクト (推奨: 2)
# 自動更新の動作確認(dry-run)
sudo certbot renew --dry-run
# 自動更新は systemd timer / cron で既に設定されている
sudo systemctl status certbot.timer
Apache の例
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d example.com
# 確認
curl -I https://example.com
# HTTP/2 200
# strict-transport-security: max-age=15552000
パターン2: AWS ACM + ALB / CloudFront
AWS で運用している場合、ACM 発行証明書を ALB(Application Load Balancer)や CloudFront にアタッチ。
# AWS CLI でリクエスト
aws acm request-certificate \
--domain-name example.com \
--subject-alternative-names www.example.com \
--validation-method DNS \
--region us-east-1
# ※ CloudFront 用は必ず us-east-1(バージニア北部)
# DNS 検証用 CNAME を Route 53 に追加
# → ACM コンソールから「Route 53 で作成」ボタン一発
# → 数分で「発行済み」に
ALB / CloudFront の HTTPS Listener にこの証明書を設定 → 自動更新(人手不要)。ACM は EC2 に直接アタッチできない点に注意。EC2 で直接 SSL 終端するなら Let's Encrypt か有料証明書。
パターン3: Cloudflare をプロキシ
- Cloudflare に無料アカウント作成
- ドメインを追加(DNS 移管)
- 各 DNS レコードをオレンジ雲(プロキシ ON)に
- SSL/TLS 設定で「Full (strict)」を選択
- 「Edge Certificates」で Cloudflare 発行証明書が自動有効化
これだけで https://example.com が即利用可能。オリジンサーバ側も自己署名証明書 or Cloudflare Origin CA を入れて HTTPS 化するのが推奨(Full strict)。
Mixed Content の解消
HTTPS ページ内で http:// の画像 / CSS / JS を読み込むと、ブラウザがブロックします:
<!-- ❌ NG: HTTPS ページから http のリソース -->
<img src="http://example.com/logo.png">
<script src="http://cdn.example.com/lib.js"></script>
<!-- ✅ OK: すべて https に -->
<img src="https://example.com/logo.png">
<script src="https://cdn.example.com/lib.js"></script>
<!-- ✅ OK: スキーマ相対 (現代では https 推奨) -->
<img src="//example.com/logo.png">
<!-- ✅ OK: 相対パス -->
<img src="/images/logo.png">
一括変換: Content-Security-Policy
# レスポンスヘッダで http → https に自動アップグレード
Content-Security-Policy: upgrade-insecure-requests
# Nginx
add_header Content-Security-Policy "upgrade-insecure-requests";
# Apache
Header set Content-Security-Policy "upgrade-insecure-requests"
HSTS (HTTP Strict Transport Security)
「このサイトには今後 HTTPS だけで来てください」とブラウザに通知するヘッダ。一度設定すると、URL に http:// と打っても自動 HTTPS 化。
# Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# パラメータ
# max-age=31536000 ← 1 年間 HTTPS 強制
# includeSubDomains ← サブドメインにも適用
# preload ← Chrome 等の HSTS Preload List に登録申請可
注意: preload 設定後はHTTPS 化を取り消せなくなる(最大 1 年)。テストで max-age=300 等から始めて段階的に伸ばす。
TLS バージョンと Cipher Suite
古い TLS 1.0 / 1.1 は2020 年に主要ブラウザで廃止。現代は TLS 1.2 + TLS 1.3 のみ有効化:
# Nginx の推奨設定(Mozilla Modern + 互換性)
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;
# Cipher Suite(Mozilla Intermediate 推奨)
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# セッション再利用
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
}
設定生成は Mozilla SSL Configuration Generator が便利。
動作確認・診断ツール
- SSL Labs Server Test — A+ を目標に
- Security Headers — HSTS / CSP 等のヘッダ点検
- Lighthouse(Chrome DevTools)— HTTPS / Mixed Content 警告
curl -I https://example.com— ヘッダ確認openssl s_client -connect example.com:443 -servername example.com— 証明書詳細
HTTP から HTTPS への 301 リダイレクト
# Nginx
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}# Apache .htaccess
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
自動更新(Let's Encrypt)
# Certbot は systemd timer で自動更新が既定有効
sudo systemctl list-timers | grep certbot
# certbot.timer Mon 2026-06-23 03:00:00 UTC
# cron に手動登録する場合
sudo crontab -e
# 毎日 3:30 に更新試行(期限 30 日切ったら更新)
30 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
# 動作確認
sudo certbot renew --dry-run
SEO 効果
- Google 検索順位の軽いプラス要因(2014 から公式)
- 同点同士の場合 HTTPS 側が優位
- Search Console は HTTP と HTTPS を別サイト扱い → HTTPS 版を登録
- サイトマップ URL も HTTPS に更新
- 外部リンクの参照元情報(Referrer)が HTTP→HTTPS で送信されない問題 →
Referrer-Policy: strict-origin-when-cross-origin
FAQ
Q: Let's Encrypt の信頼性は?
A: 主要ブラウザ・OS 全てで信頼されています。証明書の暗号化強度自体は有料証明書と同じ。違いは保証金・サポート・組織認証のみ。
Q: ワイルドカード証明書は無料で取れる?
A: Let's Encrypt で取得可能(certbot --manual --preferred-challenges dns -d *.example.com)。DNS 認証必須。
Q: 共有レンタルサーバで SSL 化したい
A: さくら / エックスサーバー / ロリポップ等は無料 SSL(Let's Encrypt ベース)を管理画面から 1 クリックで有効化できます。
Q: 証明書が期限切れになった
A: ブラウザに「危険サイト」警告が出ます。即更新(sudo certbot renew --force-renewal)。再発予防に監視(Datadog / UptimeRobot で証明書期限監視)を入れる。