メインコンテンツまでスキップ

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)
- 中間証明書が欠落
→ 検証できない、接続を拒否