chike0905の日記

何者かになりたい

Easy-RSA2を用いたオレオレCAの構築と各種鍵/証明書の発行

概要

OpenSSLを用いて認証局(CA)を構築するツール群であるEasy-RSA2を用いてオレオレCA(の鍵と証明書)を作成し、OpenVPNを構築に必要な各サーバ、クライアントそれぞれの鍵と証明書を発行する。

そもそもCA/サーバ証明書とは何か?

通常インターネット上で行われるTLS通信においては、接続先サーバが確かにそのサーバであることを認証するために、接続先サーバの公開鍵を含むサーバ証明書をサーバーから提供される。このサーバ証明書には、主に公開鍵と、接続先サーバが提供した公開鍵が確かに接続先サーバ公開鍵であることを証明するCA(認証局 による署名が含まれる。その上で、そのCAが確かに当該証明書に含まれる署名をした主体であることを証明するために、上位のCAが当該CAの中間証明書を発行する。ここで上位のCAに証明されるCAのことを中間CAと呼ぶ。中間CAがその上位の中間CAに証明を受けることで、上位のCAの署名が正しく検証できれば(上位のCAが信頼できれば)、下位のCAの署名の正当性が保証される。この連鎖構造の仕組みをトラストチェーンなどと呼ばれる。

f:id:chike0905:20191127123227p:plain

その連鎖の上で、最上位には信頼される第三者機関としてルートCAが存在し、その証明書の正当性はルート証明書として自身が証明する形で証明される(自己証明書などと呼ばれる)。そのルート証明書の正当性はルートCAが信頼されていることを前提に、TLSクライアントとなるWebブラウザなどにルートCAの公開鍵が事前インストールされており、ルート証明書をクライアントは検証をすることができるため、ルートCAの下位に位置する中間CAの証明を実施しすることが可能となる。

f:id:chike0905:20191127123231p:plain

ルートCAは誰でも構築することができ、そのためのサーバ証明書発行ソフトウェアも配布されているが、実際に運用することは難しい。なぜなら、ルートCAは信頼される必要があるため、どこの馬の骨かわからない人が構築したルートCAの発行する証明書は本当に証明を正しく行えるかは大いに疑問が残るためだ。自己を信頼に足りうる形で証明するには非常に大きなコストがかかるが、自己証明書の発行自体は誰でもできるため、自己証明をしただけで信頼性のない証明書はオレオレ証明書1などと呼ばれる。

しかし、そもそも現行のルートCAも正しく運用されているかは、個人のユーザ単位では知り得ない。サーバ証明書の実態は当該サーバの公開鍵に対する署名であり2、ルートCAの自己証明書秘密鍵さえあれば誰でも作成が可能である。また、ルートCAが証明する中間のCA、および中間CAが証明する各サーバの証明の信頼性は全てルートCAが担保する事になる。したがって、ルートCAはその信頼性を担保するためには、自己証明を行うための秘密鍵を厳重に管理する必要がある。3

環境構築

  • Debian 9上で実行
    • easy-rsaのインストール sudo apt install easy-rsa
    • CA用のディレクトリを作成 make-cadir dirname
    • dirnameが作成され、中に鍵生成スクリプトなどが入っているのがわかる
  • 以降dirname内で作業を行うものとする
    • 鍵生成をスクリプトで実施するとdirname/keysに鍵や証明書が生成される

      CAサーバ上での鍵生成

      環境変数設定

  • OpenSSLの設定ファイルがバージョンごとにdirname内に作成されている
    • OpenSSLのバージョンを確認し、バージョンにあったものをopenssl.cfgとしてコピーする
    • 次に書き換えるvarsの中から読み込んでいる
  • 環境変数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で設定した値が初期値として読み込まれる
./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 クライアント クライアント証明書廃止リスト いいえ

参考


  1. オレオレ詐欺から連想し、自分が自分であることを証明する(が、実際には攻撃者が「騙り」をしているかもしれない)信頼のおけない証明書としての俗語

  2. 実際にはその他の情報も含まれるが、抽象化のために割愛する。

  3. ここではその運用リスクなどに関しては構成などに依存する部分があるため議論しないが、以降に記載されるCAの構築を行なったとしても正しい運用を怠れば、全く意味のないものとなる。