RFC 2818 - TLS 上の HTTP (HTTPS) - 実践例 (Practical Examples)
実践例 (Practical Examples)
完全な HTTPS 接続 (Complete HTTPS Connection)
クライアント操作:
1. URI を解析: https://www.example.com/page.html
→ ホスト名: www.example.com
→ ポート: 443 (デフォルト)
2. www.example.com:443 に TCP 接続
3. TLS ハンドシェイク:
ClientHello →
← ServerHello + Certificate
証明書内のホスト名を検証
...ハンドシェイク完了...
4. 暗号化された HTTP リクエストを送信:
GET /page.html HTTP/1.1
Host: www.example.com
5. 暗号化された HTTP レスポンスを受信:
HTTP/1.1 200 OK
Content-Length: 1234
...
6. 接続を終了:
closure_alert を送信
TCP 接続を閉じる
証明書検証の例 (Certificate Verification Example)
# Python 例 (概念的)
import ssl
import socket
# SSL コンテキストを作成
context = ssl.create_default_context()
# サーバーに接続
sock = socket.create_connection(('www.example.com', 443))
ssock = context.wrap_socket(sock, server_hostname='www.example.com')
# wrap_socket は自動的に以下を検証:
# 1. 証明書チェーンが有効
# 2. ホスト名が一致
# 3. 証明書が期限切れでない
# 証明書情報を取得
cert = ssock.getpeercert()
print(f"Subject: {cert['subject']}")
print(f"Issuer: {cert['issuer']}")
print(f"SANs: {cert.get('subjectAltName', [])}")
一般的なエラー処理 (Common Error Handling)
エラー 1: 証明書ホスト名不一致 (Certificate Hostname Mismatch)
- 証明書: *.example.com
- アクセス: www.different.com
→ 接続を終了またはユーザーに警告
エラー 2: 証明書期限切れ (Certificate Expired)
- Not After: 2023-12-31
- Current: 2024-01-01
→ 接続を拒否
エラー 3: 自己署名証明書 (Self-Signed Certificate)
- 信頼された CA リストにない
→ ユーザーに警告または拒否
エラー 4: 不完全な証明書チェーン (Incomplete Certificate Chain)
- 中間証明書が欠落
→ 検証できない、接続を拒否