Easy-RSA2を用いたオレオレCAの構築と各種鍵/証明書の発行
概要
OpenSSLを用いて認証局(CA)を構築するツール群であるEasy-RSA2を用いてオレオレCA(の鍵と証明書)を作成し、OpenVPNを構築に必要な各サーバ、クライアントそれぞれの鍵と証明書を発行する。
そもそもCA/サーバ証明書とは何か?
通常インターネット上で行われるTLS通信においては、接続先サーバが確かにそのサーバであることを認証するために、接続先サーバの公開鍵を含むサーバ証明書をサーバーから提供される。このサーバ証明書には、主に公開鍵と、接続先サーバが提供した公開鍵が確かに接続先サーバ公開鍵であることを証明するCA(認証局) による署名が含まれる。その上で、そのCAが確かに当該証明書に含まれる署名をした主体であることを証明するために、上位のCAが当該CAの中間証明書を発行する。ここで上位のCAに証明されるCAのことを中間CAと呼ぶ。中間CAがその上位の中間CAに証明を受けることで、上位のCAの署名が正しく検証できれば(上位のCAが信頼できれば)、下位のCAの署名の正当性が保証される。この連鎖構造の仕組みをトラストチェーンなどと呼ばれる。
その連鎖の上で、最上位には信頼される第三者機関としてルートCAが存在し、その証明書の正当性はルート証明書として自身が証明する形で証明される(自己証明書などと呼ばれる)。そのルート証明書の正当性はルートCAが信頼されていることを前提に、TLSクライアントとなるWebブラウザなどにルートCAの公開鍵が事前インストールされており、ルート証明書をクライアントは検証をすることができるため、ルートCAの下位に位置する中間CAの証明を実施しすることが可能となる。
ルートCAは誰でも構築することができ、そのためのサーバ証明書発行ソフトウェアも配布されているが、実際に運用することは難しい。なぜなら、ルートCAは信頼される必要があるため、どこの馬の骨かわからない人が構築したルートCAの発行する証明書は本当に証明を正しく行えるかは大いに疑問が残るためだ。自己を信頼に足りうる形で証明するには非常に大きなコストがかかるが、自己証明書の発行自体は誰でもできるため、自己証明をしただけで信頼性のない証明書はオレオレ証明書1などと呼ばれる。
しかし、そもそも現行のルートCAも正しく運用されているかは、個人のユーザ単位では知り得ない。サーバ証明書の実態は当該サーバの公開鍵に対する署名であり2、ルートCAの自己証明書秘密鍵さえあれば誰でも作成が可能である。また、ルートCAが証明する中間のCA、および中間CAが証明する各サーバの証明の信頼性は全てルートCAが担保する事になる。したがって、ルートCAはその信頼性を担保するためには、自己証明を行うための秘密鍵を厳重に管理する必要がある。3
環境構築
- Debian 9上で実行
- 以降
dirname
内で作業を行うものとする - OpenSSLの設定ファイルがバージョンごとに
dirname
内に作成されている- OpenSSLのバージョンを確認し、バージョンにあったものを
openssl.cfg
としてコピーする - 次に書き換える
vars
の中から読み込んでいる
- OpenSSLのバージョンを確認し、バージョンにあったものを
- 環境変数を
vars
に設定 - 書き換え例(ここでは
vars.new
にコピーして作成)
diff vars vars.new < export KEY_COUNTRY="US" < export KEY_PROVINCE="CA" < export KEY_CITY="SanFrancisco" < export KEY_ORG="Fort-Funston" < export KEY_EMAIL="me@myhost.mydomain" < export KEY_OU="MyOrganizationalUnit" --- > export KEY_COUNTRY="JP" > export KEY_PROVINCE="Kanagawa" > export KEY_CITY="Fujisawa" > export KEY_ORG="Keio Univ." > export KEY_EMAIL="oreoreca@myhost.mydomain" > export KEY_OU="OreOre"
- 書き換え後環境変数を読み込むため
source vars
を実行
CA作成
- 以下のコマンドでCAの鍵と証明書作成
- CAの情報の入力を求められるが、
vars
で設定した値が初期値として読み込まれる
- CAの情報の入力を求められるが、
./build-ca
サーバ証明書作成
server
の部分に設定したものがホスト名として設定される
./build-key-server server
クライアント側の証明書・鍵作成
client
の部分に設定したものがホスト名/ユーザ名として設定される
./build-key client
Diffie Hellmanパラメータファイルの作成
- 以下のコマンドで
keys
以下にdh2048.pem
などのファイルが作成される- ファイル名数字部分は、
vars
内のKEY_SIZE
で設定したビット数になる(デフォルトで2048) - 実行には少し時間がかかる
- ファイル名数字部分は、
./build-dh
証明書廃止リストの作成
- 証明書廃止リストは、実際にクライアント証明書の作成と廃止を行わないと作成できない
- ダミーのクライアント証明書をいったん作成&廃止することにより証明書廃止リストを作成する
- ダミー証明書の作成
./build-key dummy
- ダミー証明書の廃止
./revoke-full dummy
./keys
内に証明書廃止リストであるcrl.pem
が作成されているのを確認する
- ダミー証明書の作成
作成したファイルの一覧
dirname/keys
以下にそれぞれ以下のようなファイルが上記手順で生成されている- これらのファイルの中でも、秘密にするべきファイルの配送には厳重な管理が必要であり、VPNなどを構築する際には、運用を精査しなければならない。
ファイル名 | 設置場所 | 目的 | 秘密かどうか |
---|---|---|---|
ca.crt | サーバ、 全てのクラインアント | ルートCAの証明書 | いいえ |
ca.key | 署名するPCのみ | ルートCAの鍵 | はい |
dh{n}.pem | サーバのみ | Diffie Hellman パラメータ | いいえ |
server.crt | サーバ | サーバの証明書 | いいえ |
server.key | サーバ | サーバの鍵 | はい |
client.crt | クライアント | クライアントの証明書 | いいえ |
client.key | クライアント | クライアントの鍵 | はい |
crl.pem | クライアント | クライアント証明書廃止リスト | いいえ |