HTTPS/SSL - 通信を守る基本中の基本
これは何?
HTTPS(Hypertext Transfer Protocol Secure)は、HTTPにSSL/TLSによる暗号化を追加したプロトコルです。ウェブサイトとブラウザの間の通信を暗号化し、第三者による盗聴や改ざんを防ぎます。
HTTPSの仕組みは以下の通りです:
- TLSハンドシェイク: ブラウザとサーバーが暗号化方式を協議
- 証明書の検証: サーバーがSSL証明書を提示し、ブラウザが認証局(CA)の署名を検証
- 鍵交換: 共通鍵暗号の鍵を安全に交換
- 暗号化通信: 以降の通信はすべて暗号化される
ブラウザのアドレスバーに鍵マークが表示されれば、HTTPS通信が確立されています。逆に「保護されていない通信」と表示される場合、HTTPで通信しており、盗聴リスクがあります。
なぜ重要なのか
HTTPでウェブサイトを運用すると、以下のリスクがあります:
1. パスワード・個人情報の盗聴
HTTPは平文で通信するため、ネットワーク上の第三者がすべての内容を読めます:
- ログインフォームのユーザー名・パスワード
- クレジットカード番号
- 個人情報(氏名、住所、電話番号)
- セッションCookie(乗っ取りに悪用可能)
特に公衆Wi-Fiでは、攻撃者が容易に盗聴できます。
2. 中間者攻撃(Man-in-the-Middle)
攻撃者がネットワーク経路に侵入し、通信内容を改ざんできます:
- マルウェアの注入
- フィッシングサイトへのリダイレクト
- 広告の挿入
- ダウンロードファイルの置き換え
3. SEO・信頼性への影響
- Google検索ランキング: 2014年以降、HTTPSはランキング要因の一つ。HTTPサイトは順位が下がる
- ブラウザの警告: Chrome、Firefox、Safariは、HTTPサイトに「保護されていない通信」警告を表示
- ユーザーの信頼: 鍵マークがないと、ユーザーは個人情報を入力したがらない
4. HTTP/2・HTTP/3が使えない
HTTP/2やHTTP/3は、HTTPSが前提です。これらのプロトコルは高速化技術(多重化、ヘッダー圧縮)を提供しますが、HTTPサイトでは利用できません。
攻撃の仕組み
Firesheep攻撃(2010年)
2010年にリリースされたFirefoxアドオン「Firesheep」は、公衆Wi-Fiでの盗聴攻撃を誰でも実行できるようにしました:
- 攻撃者がカフェなどの公衆Wi-Fiに接続
- Firesheepを起動し、同じネットワークのHTTP通信を監視
- ログイン済みユーザーのセッションCookieを盗む
- そのCookieを使って、ユーザーのアカウントに不正ログイン
当時、Facebook、Twitter、AmazonなどはHTTPでCookieを送信していたため、簡単に乗っ取られました。この事件を契機に、主要サイトはHTTPSに移行しました。
SSLストリッピング攻撃
攻撃者が中間者となり、HTTPSをHTTPに降格させる攻撃です:
- ユーザーが
http://bank.comにアクセス(HTTPリンクをクリック) - 本来は
https://bank.comにリダイレクトされるべき - 攻撃者が中間でリダイレクトを遮断し、HTTPのままユーザーに返す
- ユーザーはHTTPでログイン情報を送信し、攻撃者に盗聴される
対策として、後述のHSTS(HTTP Strict Transport Security)が有効です。
実際の被害事例
Lenovo Superfish事件(2015年)
PC製造大手のLenovoが、プリインストールした広告ソフト「Superfish」により、すべてのHTTPS通信を中間者攻撃していました。Superfishは自己署名証明書をインストールし、暗号化通信を復号して広告を挿入していました。同じ証明書がすべてのPCに入っていたため、攻撃者がこれを抽出すれば、Lenovoユーザーの通信を盗聴できる状態でした。
中国のGreat Cannon(2015年)
中国政府が運用する検閲システム「Great Firewall」の攻撃機能「Great Cannon」が、HTTPトラフィックにJavaScriptを注入し、GitHubへのDDoS攻撃を実行しました。HTTPサイトの訪問者が、知らないうちに攻撃の踏み台にされました。
公衆Wi-Fiでのパスワード盗聴
2018年、欧州の空港Wi-Fiで、HTTPサイトのログイン情報が大量に盗まれる事件がありました。攻撃者は正規のWi-Fiアクセスポイントを模倣(Evil Twin攻撃)し、接続した利用者のHTTP通信を盗聴しました。
Nyambushでの検出内容
Nyambushは、以下の項目をチェックします:
- HTTPS対応: サイトがHTTPSで応答するか
- HTTPからのリダイレクト:
http://へのアクセスがhttps://に自動転送されるか - 証明書の有効性:
- 有効期限切れでないか
- 証明書のドメインが一致するか
- 信頼できるCAが発行したか
- TLSバージョン: 古いSSL 3.0やTLS 1.0/1.1を使っていないか(脆弱性あり)
- 暗号スイート: 脆弱な暗号化方式(DES、RC4など)を使っていないか
スキャン結果では、HTTPSが未設定の場合、Let's Encryptによる無料証明書の取得方法を案内します。
対策方法
1. SSL証明書の取得
Let's Encryptで無料証明書を取得
Let's Encryptは、無料でSSL証明書を発行する認証局です。certbotツールを使えば、簡単に取得・自動更新できます。
# Ubuntu/Debianの場合
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx
# Nginx用の証明書を取得・設定
sudo certbot --nginx -d example.com -d www.example.com
# 自動更新のテスト
sudo certbot renew --dry-run
Certbotは自動的に以下を行います:
- 証明書の取得
- Nginxの設定を書き換えてHTTPSを有効化
- HTTPからHTTPSへのリダイレクト設定
- 90日ごとの自動更新
有料証明書の選択肢
Let's Encryptで十分な場合が多いですが、以下のような場合は有料証明書も検討します:
- EV証明書: ブラウザのアドレスバーに組織名を表示(銀行、EC大手など)
- ワイルドカード証明書:
*.example.comで全サブドメインをカバー(Let's Encryptも対応) - サポート重視: 24時間サポートが必要な企業向け
主要なCA:DigiCert、GlobalSign、Sectigo(旧Comodo)
2. Webサーバーの設定
Nginxの場合
server {
listen 80;
server_name example.com www.example.com;
# HTTPからHTTPSへリダイレクト
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL証明書
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 推奨されるSSL設定
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;
# OCSP Stapling(証明書の検証を高速化)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
location / {
root /var/www/html;
index index.html;
}
}
Apacheの場合
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# 推奨されるSSL設定
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
DocumentRoot /var/www/html
</VirtualHost>
3. クラウドホスティングの場合
Cloudflareの無料SSL
Cloudflareを使えば、DNSを切り替えるだけで自動的にHTTPSが有効になります:
- Cloudflareにアカウント登録
- ドメインを追加し、ネームサーバーをCloudflareに変更
- SSL/TLS設定で「Full (Strict)」を選択
- 「Always Use HTTPS」を有効化
Vercel、Netlifyなどのホスティング
Next.js、Gatsby、StaticサイトをVercelやNetlifyでホスティングする場合、HTTPSは自動で有効化されます。設定不要です。
4. 混合コンテンツの解消
HTTPSページ内でHTTPリソース(画像、CSS、JavaScriptなど)を読み込むと、ブラウザが警告を表示します:
<!-- ❌ 悪い例: HTTP画像 -->
<img src="http://example.com/image.jpg">
<!-- ✅ 良い例: HTTPS画像 -->
<img src="https://example.com/image.jpg">
<!-- ✅ より良い例: プロトコル相対URL -->
<img src="//example.com/image.jpg">
すべてのリソースをHTTPSに変更し、混合コンテンツを解消してください。
5. SSL Labs テスト
設定後は、SSL Labs(https://www.ssllabs.com/ssltest/)でサーバーの安全性をテストします。A+評価を目指しましょう。
まとめ
HTTPSは、現代のウェブサイトにとって必須のセキュリティ対策です。Let's Encryptにより、無料で簡単に導入できるようになりました。HTTPのままサイトを運用することは、ユーザーの個人情報を危険にさらすだけでなく、SEOでも不利になります。
導入は意外と簡単で、certbotを使えば数分で完了します。クラウドホスティングを使っている場合は、さらに簡単です。今すぐHTTPSに移行し、安全で信頼されるウェブサイトを構築しましょう。Nyambushの無料スキャンで、あなたのサイトのHTTPS設定を確認してみてください。