前回の記事では、HTTPリクエストとレスポンスの基本構造について解説しました。今回は、HTTPをセキュアにするHTTPSと、その基盤となるSSL/TLS暗号化の仕組みについて詳しく解説します。
現代のWeb開発において、HTTPS対応は必須です。HTTPSを理解することで、なぜセキュアな通信が必要なのか、SSL/TLS証明書がどのような役割を果たしているのかを把握できます。
HTTPとHTTPSの違い
HTTPとHTTPSの最も大きな違いは、通信が暗号化されているかどうかです。この違いがWebセキュリティにおいて非常に重要な意味を持ちます。
HTTPの問題点
HTTP(HyperText Transfer Protocol)は、データを平文(暗号化されていない状態)で送受信します。これにより、以下のセキュリティリスクが発生します。
| リスク | 説明 |
|---|---|
| 盗聴 | 第三者が通信内容を傍受し、パスワードや個人情報を取得できる |
| 改ざん | 通信途中でデータを書き換えられる可能性がある |
| なりすまし | 偽のサーバーが正規のサーバーになりすますことができる |
sequenceDiagram
participant Client as クライアント
participant Attacker as 攻撃者
participant Server as サーバー
Client->>Server: 平文のHTTPリクエスト
Note over Attacker: 攻撃者が傍受可能HTTPSによる解決
HTTPS(HTTP Secure)は、HTTP通信をSSL/TLSプロトコルで暗号化したものです。HTTPSでは以下の3つの保護が提供されます。
| 保護機能 | 説明 |
|---|---|
| 機密性(暗号化) | 通信内容を第三者が読み取れないようにする |
| 完全性(改ざん検知) | データが途中で改ざんされていないことを保証する |
| 認証(本人確認) | 通信相手が正規のサーバーであることを確認する |
sequenceDiagram
participant Client as クライアント
participant Attacker as 攻撃者
participant Server as サーバー
Client->>Server: 暗号化されたHTTPSリクエスト
Note over Attacker: 攻撃者は解読不可HTTPとHTTPSの技術的な違い
HTTPとHTTPSには、以下の技術的な違いがあります。
| 項目 | HTTP | HTTPS |
|---|---|---|
| 使用ポート | 80 | 443 |
| URLスキーム | http:// |
https:// |
| 暗号化 | なし | SSL/TLSによる暗号化 |
| 証明書 | 不要 | SSL/TLS証明書が必要 |
| 通信速度 | やや速い | 暗号化処理によりわずかに遅い |
SSL/TLS暗号化の仕組み
SSL/TLSは、インターネット上で安全な通信を実現するための暗号化プロトコルです。HTTPS通信の基盤となる技術です。
SSLとTLSの歴史
SSL(Secure Sockets Layer)は、Netscape社が1990年代に開発した暗号化プロトコルです。その後、IETF(Internet Engineering Task Force)によって標準化され、TLS(Transport Layer Security)として発展しました。
| バージョン | 公開年 | 状態 |
|---|---|---|
| SSL 2.0 | 1995年 | 廃止(脆弱性あり) |
| SSL 3.0 | 1996年 | 廃止(脆弱性あり) |
| TLS 1.0 | 1999年 | 廃止(2020年以降非推奨) |
| TLS 1.1 | 2006年 | 廃止(2020年以降非推奨) |
| TLS 1.2 | 2008年 | 現役(広く使用されている) |
| TLS 1.3 | 2018年 | 最新(推奨) |
現在、「SSL」という用語は慣習的に使われていますが、実際にはTLS 1.2またはTLS 1.3が使用されています。
暗号化の種類
SSL/TLSでは、2種類の暗号化方式を組み合わせて使用します。
共通鍵暗号方式(対称鍵暗号)
送信者と受信者が同じ鍵を使用してデータを暗号化・復号する方式です。
flowchart LR
subgraph 共通鍵暗号方式
A["平文"] -->|共通鍵で暗号化| B["暗号文"]
B -->|共通鍵で復号| C["平文"]
end
Note1["メリット: 処理が高速"]
Note2["デメリット: 鍵の共有方法が課題"]代表的なアルゴリズム: AES(Advanced Encryption Standard)
公開鍵暗号方式(非対称鍵暗号)
公開鍵と秘密鍵のペアを使用する方式です。公開鍵で暗号化したデータは、対応する秘密鍵でのみ復号できます。
sequenceDiagram
participant Sender as 送信者
participant Receiver as 受信者
Note over Sender,Receiver: 公開鍵暗号方式
Receiver->>Sender: 公開鍵を送付
Note over Sender: 平文を公開鍵で暗号化
Sender->>Receiver: 暗号文を送信
Note over Receiver: 秘密鍵で復号 → 平文
Note over Sender,Receiver: メリット: 鍵の共有が安全
Note over Sender,Receiver: デメリット: 処理が遅い代表的なアルゴリズム: RSA、ECDSA(楕円曲線DSA)
ハイブリッド暗号方式
SSL/TLSでは、両方の暗号化方式の長所を活かすハイブリッド暗号方式を採用しています。
sequenceDiagram
participant Client as クライアント
participant Server as サーバー
Note over Client,Server: ハイブリッド暗号方式
Note over Client,Server: 1. 公開鍵暗号で「共通鍵」を安全に交換
Client->>Server: 公開鍵暗号で共通鍵を交換
Note over Client,Server: 2. 交換した共通鍵で実際のデータを高速に暗号化
Client->>Server: 共通鍵暗号で高速なデータ通信証明書の役割
SSL/TLS証明書は、Webサイトの身元を証明し、暗号化通信を実現するために必要なデジタル証明書です。
証明書に含まれる情報
SSL/TLS証明書には以下の情報が含まれています。
| 項目 | 説明 |
|---|---|
| ドメイン名 | 証明書が有効なドメイン(例: example.com) |
| 発行者(CA) | 証明書を発行した認証局の名前 |
| 有効期間 | 証明書の有効開始日と終了日 |
| 公開鍵 | サーバーの公開鍵情報 |
| 署名 | 認証局によるデジタル署名 |
認証局(CA)の役割
認証局(Certificate Authority: CA)は、SSL/TLS証明書を発行する信頼された第三者機関です。
flowchart LR
subgraph CA["認証局(CA)の役割"]
A["サイト運営者"] -->|1. 申請| B["CA"]
B -->|2. ドメイン所有権を検証| B
B -->|3. 証明書を発行(署名付き)| C["証明書"]
end代表的な認証局として、以下があります。
- Let’s Encrypt(無料の認証局)
- DigiCert
- GlobalSign
- Sectigo(旧Comodo)
証明書の種類
SSL/TLS証明書には、検証レベルによって3つの種類があります。
| 種類 | 検証レベル | 特徴 |
|---|---|---|
| DV証明書(Domain Validation) | ドメイン所有権のみ | 最も簡易。Let’s Encryptで無料取得可能 |
| OV証明書(Organization Validation) | 組織の実在確認 | 企業サイト向け。組織情報が確認される |
| EV証明書(Extended Validation) | 厳格な組織審査 | 高い信頼性が必要なサイト向け |
証明書チェーン
ブラウザは「ルート証明書」を信頼の起点として、証明書チェーン(信頼の連鎖)を検証します。
flowchart TB
subgraph chain["証明書チェーン"]
Root["ルート証明書<br>(Root CA)"]
Intermediate["中間証明書<br>(Intermediate)"]
Server["サーバー証明書<br>(End-entity)"]
Root -->|署名| Intermediate
Intermediate -->|署名| Server
end
Note1["ブラウザに事前インストール済み<br>自己署名で信頼の起点"] -.- Root
Note2["ルートCAから署名を受けた証明書"] -.- Intermediate
Note3["中間CAから署名を受けた証明書<br>Webサイトに設定"] -.- ServerHTTPS通信の流れ
HTTPS通信は、TLSハンドシェイクと呼ばれる手順で暗号化通信を確立します。ここでは、TLS 1.2とTLS 1.3のハンドシェイクの流れを解説します。
TLS 1.2のハンドシェイク
TLS 1.2では、暗号化通信を確立するために2往復(2-RTT)の通信が必要です。
sequenceDiagram
participant Client as クライアント
participant Server as サーバー
Client->>Server: 1. ClientHello(対応する暗号スイート一覧)
Server->>Client: 2. ServerHello(選択した暗号スイート)
Server->>Client: 3. Certificate(サーバー証明書)
Server->>Client: 4. ServerKeyExchange(鍵交換に必要な情報)
Server->>Client: 5. ServerHelloDone
Note over Client: 証明書の検証
Client->>Server: 6. ClientKeyExchange(プリマスターシークレット)
Client->>Server: 7. ChangeCipherSpec(暗号化通信への切り替え通知)
Client->>Server: 8. Finished(ハンドシェイク完了通知)
Server->>Client: 9. ChangeCipherSpec
Server->>Client: 10. Finished
Note over Client,Server: 暗号化通信開始TLS 1.3のハンドシェイク
TLS 1.3では、ハンドシェイクが1往復(1-RTT)に短縮され、パフォーマンスが向上しています。
sequenceDiagram
participant Client as クライアント
participant Server as サーバー
Client->>Server: 1. ClientHello + 鍵共有パラメータ
Server->>Client: 2. ServerHello + 鍵共有パラメータ<br>+ EncryptedExtensions<br>+ Certificate<br>+ CertificateVerify<br>+ Finished
Note over Client: 証明書の検証
Client->>Server: 3. Finished
Note over Client,Server: 暗号化通信開始TLS 1.3の主な改善点
TLS 1.3は、TLS 1.2から以下の点が改善されています。
| 改善点 | 説明 |
|---|---|
| ハンドシェイクの高速化 | 2-RTTから1-RTTに短縮 |
| 0-RTT再接続 | 以前接続したサーバーへの再接続時、即座にデータ送信可能 |
| 脆弱な暗号の廃止 | RSA鍵交換、RC4、SHA-1などの脆弱なアルゴリズムを削除 |
| 前方秘匿性の必須化 | すべての接続で前方秘匿性を保証 |
| ハンドシェイクの暗号化 | 証明書情報も暗号化されプライバシーが向上 |
開発者ツールでHTTPS通信を確認する方法
Chrome DevToolsを使用して、Webサイトのセキュリティ状態やHTTPS通信の詳細を確認できます。
前提条件
| 項目 | 内容 |
|---|---|
| ブラウザ | Google Chrome(最新版推奨) |
| 確認対象 | HTTPS対応のWebサイト |
プライバシーとセキュリティパネルの使用
Chrome DevToolsのプライバシーとセキュリティパネルで、HTTPS通信の状態を確認できます。
パネルを開く手順
- 確認したいWebサイトを開く
F12キーまたはCtrl+Shift+I(macOSはCmd+Option+I)でDevToolsを開くCtrl+Shift+P(macOSはCmd+Shift+P)でコマンドメニューを開く- 「privacy」と入力し、「プライバシーとセキュリティを表示」を選択
確認できる情報
セキュリティパネルでは以下の情報を確認できます。
| 項目 | 説明 |
|---|---|
| セキュリティ概要 | ページ全体のセキュリティ状態 |
| 証明書情報 | サーバー証明書の詳細 |
| 接続の暗号化 | 使用されているTLSバージョンと暗号スイート |
| 混合コンテンツ | HTTPリソースの読み込み警告 |
Networkパネルでの確認
Networkパネルでは、各リクエストの詳細なセキュリティ情報を確認できます。
確認手順
- DevToolsのNetworkタブを開く
- ページを再読み込み(
F5またはCtrl+R) - 任意のリクエストをクリック
- 「Security」タブを選択
期待される結果
正常なHTTPS接続の場合、以下の情報が表示されます。
Connection - secure (TLS 1.3)
Certificate - valid and trusted
curlコマンドでの確認
ターミナルからcurlコマンドを使用して、SSL/TLS証明書の情報を確認することもできます。
|
|
期待される出力例:
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* Server certificate:
* subject: CN=example.com
* issuer: C=US; O=Let's Encrypt; CN=R11
* expire date: Mar 31 00:00:00 2026 GMT
opensslコマンドでの確認
より詳細な証明書情報を確認する場合は、opensslコマンドを使用します。
|
|
まとめ
この記事では、HTTPSとSSL/TLSの仕組みについて解説しました。重要なポイントを振り返ります。
- HTTPは平文通信であり、盗聴・改ざん・なりすましのリスクがある
- HTTPSはSSL/TLSによる暗号化で、機密性・完全性・認証を提供する
- SSL/TLSは公開鍵暗号と共通鍵暗号を組み合わせたハイブリッド方式を採用
- 証明書は認証局(CA)が発行し、サーバーの身元を証明する
- TLS 1.3は1-RTTでハンドシェイクが完了し、セキュリティとパフォーマンスが向上
- Chrome DevToolsでHTTPS通信の状態を確認できる
現代のWeb開発では、HTTPS対応は必須です。次回は、CookieとSessionの仕組みについて解説し、HTTPのステートレス性をどのように補うかを学びます。