OpenVPNドキュメント

マスター認証機関(CA)の設定 / 証明書と鍵の生成

概要

OpenVPN 2.xの設定の最初のステップは、PKI (公開鍵基盤) を構築することです。
PKIは以下の要素で構成されます。

  • サーバーと各クライアントに必要な証明書(公開鍵とも呼ばれる)と秘密鍵
  • 各サーバー証明書とクライアント証明書への署名に使用するマスター認証機関(CA)の証明書と鍵

OpenVPNは証明書に基づく双方向の認証をサポートしています。
即ち、相互に信頼された接続を確立するには、クライアントはサーバーの証明書を認証し、サーバーはクライアントの証明書を認証する必要があります。

サーバーとクライアントは、まず提示された証明書がマスター認証機関(CA)によって署名されている事を確認し、次に証明書ヘッダー内の共通名や認証タイプ等の情報を確認することで、お互いを認証します。

このセキュリティモデルには、VPNの観点から数多くの利点があります。

  • サーバーは自身の証明書/キーさえ所有していれば良く、サーバーに接続する可能性のある全てのクライアントの証明書を知る必要はありません。
  • サーバーは、マスター認証機関(CA)によって署名された証明書を持つクライアントのみを受け入れます。
    また、サーバーはCA秘密鍵自体にアクセスすることなく署名検証を実行できるため、PKI全体の中で最も機密性の高い鍵であるCA鍵が全く別のマシン、さらにはネットワークに接続されていないマシン上に存在していても問題としません。
  • 秘密鍵に問題があった場合、その証明書をCRL(certificate revocation list / 証明書失効リスト)に追加することで無効化できます。
    CRLを使用することで、PKI全体を再構築することなく、問題のあった証明書を選択的に拒否することが可能です。
  • サーバーは証明書に埋め込まれた特定フィールド(共通名など)に基づいて、クライアント固有のアクセス権を適用できます。

マスター認証機関(CA)の証明書と鍵の生成

このセクションでは、マスターCAの証明書と鍵、サーバーの証明書と鍵、および3台の個別クライアントそれぞれの証明書と鍵を生成する方法を説明します。

Linux、BSD、Unix系OSを使用している場合は、シェルを開きcdコマンドでOpenVPNを配置したディレクトリのeasy-rsaサブディレクトリに移動してください。

OpenVPNをRPMまたはDEBファイルからインストールした場合、easy-rsaディレクトリは通常/usr/share/doc/packages/openvpn、もしくは/usr/share/doc/openvpnにあります。

.tar.gzファイルからインストールした場合、easy-rsaディレクトリは展開されたソースツリーの一番上のディレクトリにあります。

Windowsをお使いの場合は、コマンドプロンプトを開きcdコマンドで\Program Files\OpenVPN\easy-rsaに移動します。
以下のバッチファイルを実行して設定ファイルをコピーします。
これにより既存のvars.batファイルとopenssl.cnfファイルが上書きされます。

init-config

varsファイル(Windowsの場合はvars.batファイル)を編集し、KEY_COUNTRY、KEY_PROVINCE、KEY_CITY、KEY_ORG、KEY_EMAILの各パラメータを設定します。
これらのパラメータはブランクにしないでください。

次に、PKIを初期化します。

  • Linux/BSD/Unixの場合:
. ./vars
./clean-all
./build-ca
  • Windowsの場合:
vars
clean-all
build-ca

最後にbuild-caコマンドを実行すると、opensslコマンドが呼び出され、認証機関(CA)の証明書と鍵が生成されます。

ai:easy-rsa # ./build-ca
Generating a 1024 bit RSA private key
............++++++
...........++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:OpenVPN-CA
Email Address [me@myhost.mydomain]:

クエリされたパラメータのほとんどがvarsもしくはvars.batファイルで設定した値にデフォルト設定されていることに注意してください 。
必須入力パラメータはCommon Name(共通名)のみです。
上記例では仮に"OpenVPN-CA"としています。


サーバー用の証明書と鍵の生成

次に、サーバーの証明書と秘密鍵を生成します。

  • Linux/BSD/Unixの場合:
./build-key-server server
  • Windowsの場合:
build-key-server server

ほとんどのパラメータはデフォルトのままで問題ありません。
Common Name(共通名)の入力を求められたら"server"と入力します。
"Sign the certificate? [y/n](証明書に署名しますか?)"、"1 out of 1 certificate requests certified, commit? [y/n](1件中1件の証明書要求が認証されました。コミットしますか?)"の質問には共に"Yes"と入力します。


3台の個別クライアントの証明書と鍵の生成

クライアント証明書の生成は前の手順とほぼ同様です。

  • Linux/BSD/Unixの場合:
./build-key client1
./build-key client2
./build-key client3
  • Windowsの場合:
build-key client1
build-key client2
build-key client3

クライアントの鍵をパスワードで保護する場合はbuild-key-passコマンドを代わりに使用します。
また、各クライアントには別々のCommon Name(共通名)をプロンプトで入力する必要があります。(例:"client1","client2","client3")
各クライアントには必ずユニークである共通名を使用してください。


Diffie Hellmanパラメータの生成

OpenVPNサーバー用にDiffie Hellmanパラメータを生成する必要があります。

  • Linux/BSD/Unixの場合:
./build-dh
  • Windowsの場合:
build-dh

コマンドを実行すると以下のように出力されます。

ai:easy-rsa # ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.................+...........................................
...................+.............+.................+.........
......................................

鍵ファイル

新しく生成された証明書と鍵はkeysサブディレクトリに保存されます。

ファイル名 適用場所 目的 シークレット
ca.crt サーバー + 全てのクライアント ルートCAの証明書 NO
ca.key 署名マシンのみ ルートCAの鍵 YES
dh{n}.pem サーバーのみ Diffie Hellmanパラメータ NO
server.crt サーバーのみ サーバーの証明書 NO
server.key サーバーのみ サーバーの鍵 YES
client1.crt クライアント1のみ クライアント1の証明書 NO
client1.key クライアント1のみ クライアント1の鍵 YES
client2.crt クライアント2のみ クライアント2の証明書 NO
client2.key クライアント2のみ クライアント2の鍵 YES
client3.crt クライアント3のみ クライアント3の証明書 NO
client3.key クライアント3のみ クライアント3の鍵 YES

鍵を生成したら全てのファイルを必要とするマシンにコピーします。
重要なファイルなのでやりとりには充分注意してください。