HTTPS や OpenVPN を利用する上で SSL/TLS についての理解がないと大変だったため、調べたことをざっくりとまとめた。
公開鍵暗号と共通鍵暗号
まずはじめに、SSL/TLS で使われる公開鍵暗号と共通鍵暗号について。
公開鍵暗号 | 共通鍵暗号 | |
---|---|---|
暗号化 | 公開鍵を使う | 共通鍵を使う |
復号化 | 秘密鍵を使う | 共通鍵を使う |
メリット | 秘密鍵が漏れない限り安全 | 処理速度が速い |
デメリット | 処理速度が遅い | 共通鍵を安全に共有する必要がある |
それぞれメリット・デメリットがあるが、SSL/TLS ではそれぞれのデメリットをカバーし合うように両方の暗号化方式が用いられている。
SSL/TLS とは
暗号化通信を行うためのプロトコル。
Web (HTTPS) や OpenVPN など、さまざまな用途で暗号化通信をするのに SSL/TLS が用いられている。
TLS と呼ぶのがより正確1だが、SSL/TLS または単に SSL と呼ぶことも多い。
今回は SSL で統一する。
SSL 通信における登場人物
SSL 通信を行う際には「クライアント」「サーバ」「認証局 (CA)」の三者を考える必要がある。
※ 中間認証局については割愛
クライアント
- SSL 通信をしたい端末
- サーバから証明書を提示された際に、あらかじめインストールしてある CA 証明書と署名が一致するかどうかでサーバの信頼性を検証する
- CA 証明書とサーバ証明書から公開鍵を複合し、その公開鍵でデータを暗号化してサーバに送信する
サーバ
- SSL 通信を受け入れる端末
- あらかじめ認証局 (CA) に署名された証明書を保持しておき、クライアントから SSL 接続要求があった際に証明書を提示する
- 証明書の署名要求に使った秘密鍵を利用して、クライアントから受信した暗号化されたデータを復号化できる
認証局 (CA)
- 署名要求に対して、署名された証明書を発行することができる
- クライアントがある認証局を信頼する (CA 証明書をインストールする) ということは、クライアントは「その認証局が署名した証明書を持つすべてのサーバ」を信頼することを意味する
- 公的に認められた認証局を「パブリック認証局」、そうでない認証局を「プライベート認証局」という
- 有名なパブリック認証局としては Symantec とか GeoTrust とか
- ブラウザなどにプリインストールされている CA 証明書はパブリック認証局のもの
SSL に関わるファイル
SSL を扱うときは様々な種類/形式のファイルがあってややこしい。
ここでは概要だけまとめるが、以下の記事がより詳細でわかりやすい。
ファイルの種類
略語 | 意味 | 用途 |
---|---|---|
KEY | 秘密鍵 (Private Key) | クライアントが公開鍵で暗号化して送ってくるデータを復号化するのに必要。絶対に外部に漏らしてはいけないやつ。 |
CRT | 証明書 (Certificate) | 認証局が発行し、サーバが保持するもの。クライアントから SSL 接続要求が来た際に提示する。 |
CSR | 証明書署名要求 (Certificate Signing Request) | サーバが認証局に証明書の署名を要求するために、秘密鍵から CSR を作成して認証局に送りつける。 |
CRL | 証明書失効リスト (Certification Revocation List) | 認証局が発行し、クライアントが保持するもの。サーバから提示された証明書が失効していないかどうかを確認するのに利用する。 |
ファイル形式
略語 | フォーマット名 | 用途 |
---|---|---|
DER | Distinguished Encoding Rules | ASN.1 というデータ構造をバイナリデータとしてエンコードした形式。 |
PEM | Privacy Enhanced Mail | DER を Base64 でテキストとしてエンコードした形式。パスフレーズを設定することもできる。 |
SSL 通信の手順
SSL 通信では、公開鍵暗号を利用して共通鍵を共有し、共通鍵暗号で通信を行う。
公開鍵暗号を利用するためには、事前に秘密鍵を生成したり署名された証明書を配置したりしておく必要がある。
事前にやること
サーバ
- SSL 通信に使用するサーバ秘密鍵を用意する
- サーバ秘密鍵から証明書署名要求 (CSR) を作成する
- 証明書署名要求 (CSR) を認証局に送信する
- 認証局から署名されたサーバ証明書が送られてくる
- サーバ秘密鍵とサーバ証明書をサーバに設置する
- Web サーバであれば、Apache や Nginx などの設定ファイルに秘密鍵/証明書のパスを記述する
クライアント
- 認証局の CA 証明書をインストールする
- Web ブラウザであれば、既にパブリック認証局の CA 証明書はインストールされている
通信する
サーバの信頼性を検証する
- クライアントからサーバに SSL 接続要求を送る
- サーバはサーバ証明書をクライアントに提示する
- クライアントは、受け取ったサーバ証明書の署名が CA 証明書の署名と一致するかどうかを検証する
共通鍵を共有する
- クライアントは、CA 証明書から CA 公開鍵を取得する
- クライアントは、CA 公開鍵とサーバ証明書からサーバ公開鍵を取得する
- クライアントは、共通鍵を作成する
- クライアントは、作成した共通鍵をサーバ公開鍵を使って暗号化し、サーバに送信する
- サーバは、暗号化された共通鍵を受け取り、サーバ秘密鍵を使って復号化する
暗号化通信を行う
- クライアント - サーバ 間は共通鍵暗号を利用して通信を行う