メインコンテンツにスキップ

🔒 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を理解したら、次を学習してみましょう:

  1. CORSとは? (文書作成予定) - HTTPSと共に重要なWebセキュリティ
  2. JWTトークン (文書作成予定) - 安全な認証方式
  3. 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のおかげで、今は無料で簡単に適用できます! 🔒✨