🔒 HTTPSとSSL/TLSとは?
📖 定義
HTTPS(HyperText Transfer Protocol Secure)は、HTTPにセキュリティ層を追加したプロトコルです。SSL(Secure Sockets Layer)とTLS(Transport Layer Security)は、インターネット通信を暗号化するプロトコルで、TLSはSSLの後継版です。これらはウェブサイトとユーザー間のデータを暗号化して安全に転送します。
🎯 比喩で理解する
普通郵便 vs 書留郵便
- HTTP: ハガキのように誰でも内容を見られる通信
- HTTPS: 封印された書留郵便のように本人だけが開封できる安全な通信
- SSL/TLS証明書: 郵便物の公式認証スタンプ
普通郵便(HTTP)でパスワードを送ると、郵便局員や他の人が見ることができますが、封印された書留郵便(HTTPS)は受取人だけが開封できます。
⚙️ 動作原理
1. SSL/TLSハンドシェイク過程
1. クライアント → サーバー: "安全な接続を開始したい"
- サポートする暗号化方式リストを送信
2. サーバー → クライアント: "私の証明書です"
- SSL/TLS証明書と公開鍵を送信
3. クライアント: 証明書を検証
- 信頼できるCA(認証局)が発行したか確認
- 証明書が有効か確認
4. クライアント → サーバー: 暗号化されたセッションキーを生成
- サーバーの公開鍵でセッションキーを暗号化して送信
5. サーバー: セッションキーを復号化
- 自分の秘密鍵でセッションキーを復号化
6. 安全な通信開始
- セッションキーですべてのデータを暗号化してやり取り
2. 暗号化方式
非対称暗号化 (ハンドシェイク)
├─ 公開鍵: データを暗号化
└─ 秘密鍵: データを復号化
対称暗号化 (実際の通信)
└─ セッションキー: 高速な暗号化/復号化
💡 実例
HTTP vs HTTPS比較
// ❌ HTTP - 安全ではない
// http://example.com/login
// パスワードが平文で送信される
POST /login
Content-Type: application/json
{
"username": "user123",
"password": "mypassword123" // 誰でも見られる!
}
// ✅ HTTPS - 安全
// https://example.com/login
// すべてのデータが暗号化される
POST /login
Content-Type: application/json
{
"username": "user123",
"password": "mypassword123" // 暗号化されて送信
}
SSL/TLS証明書の確認
ブラウザで鍵アイコンをクリックすると:
✅ 安全なサイト
- 発行先: example.com
- 発行元: Let's Encrypt (信頼できるCA)
- 有効期限: 2024-01-01 ~ 2024-12-31
- 暗号化: TLS 1.3
⚠️ 注意が必要
- 証明書が期限切れ
- 自己署名証明書
- 証明書のドメインとサイトのドメインが異なる
Node.jsでHTTPSサーバーを作成
const https = require('https');
const fs = require('fs');
// SSL/TLS証明書をロード
const options = {
key: fs.readFileSync('private-key.pem'), // 秘密鍵
cert: fs.readFileSync('certificate.pem') // 証明書
};
// HTTPSサーバーを作成
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('安全なHTTPS接続です!');
}).listen(443);
console.log('HTTPSサーバーがポート443で実行中です');
🤔 よくある質問
Q1. SSLとTLSの違いは?
A: SSLは古いプロトコルで、TLSはSSLを改善した最新版です。しかし、慣習的に「SSL証明書」と呼び、実際にはTLSを使用します。
SSL 1.0 (使用不可)
SSL 2.0 (使用不可)
SSL 3.0 (使用不可)
TLS 1.0 (レガシー)
TLS 1.1 (レガシー)
TLS 1.2 (現在使用中) ✅
TLS 1.3 (最新、最も安全) ✅
Q2. なぜすべてのサイトがHTTPSを使うべき?
A: HTTPSは以下を保護します:
1. 機密性 (Confidentiality)
└─ 第三者がデータを見られない
2. 完全性 (Integrity)
└─ データが途中で改ざんされていないことを保証
3. 認証 (Authentication)
└─ 接続したサイトが本物であることを証明
4. SEOのメリット
└─ GoogleはHTTPSサイトに加点
Q3. Let's Encryptとは?
A: 無料でSSL/TLS証明書を発行する認証局(CA)です。
# Certbotで自動インストール
sudo certbot --nginx -d example.com
# 証明書の自動更新(90日ごと)
sudo certbot renew --dry-run
Q4. 混合コンテンツ警告とは?
A: HTTPSページでHTTPリソースをロードするときに発生するセキュリティ警告です。
<!-- ❌ 混合コンテンツ - セキュリティ警告 -->
<html>
<head>
<!-- HTTPSページ -->
</head>
<body>
<!-- HTTP画像をロード - 警告発生! -->
<img src="http://example.com/image.jpg">
<!-- HTTPスクリプト - ブロックされる! -->
<script src="http://example.com/script.js"></script>
</body>
</html>
<!-- ✅ 正しい方法 -->
<html>
<body>
<!-- HTTPSを使用 -->
<img src="https://example.com/image.jpg">
<!-- またはプロトコル相対URL -->
<img src="//example.com/image.jpg">
</body>
</html>
Q5. HTTPSは遅くないですか?
A: 過去はそうでしたが、現代のTLS 1.3とハードウェアアクセラレーションにより、パフォーマンス差はほとんどありません。
TLS 1.2ハンドシェイク: 2-RTT (往復時間)
TLS 1.3ハンドシェイク: 1-RTT
TLS 1.3再接続: 0-RTT (即座に接続!)
+ HTTP/2はHTTPSのみサポート → むしろ速い
🎓 次のステップ
HTTPSを理解したら、次を学習してみましょう:
- CORSとは? (文書作成予定) - HTTPSと共に重要なWebセキュリティ
- JWTトークン (文書作成予定) - 安全な認証方式
- DNSとは? - ドメインとセキュリティ
実践してみる
# 1. 自己署名証明書を作成(開発用)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
# 2. HTTPSサーバーを実行
node https-server.js
# 3. ブラウザで確認
# https://localhost (自己署名警告を無視して進む)
🎬 まとめ
HTTPSとSSL/TLSは現代Webの必須セキュリティ技術です:
- HTTPS: HTTPにセキュリティ層を追加したプロトコル
- SSL/TLS: データを暗号化するセキュリティプロトコル
- 証明書: ウェブサイトの身元を証明するデジタル身分証
- 暗号化: データを安全に保護する技術
すべてのウェブサイトはユーザー保護のためにHTTPSを使用すべきです。Let's Encryptのおかげで、今は無料で簡単に適用できます! 🔒✨