OpenVPNドキュメント
概要
OpenVPN 2.xの設定の最初のステップは、PKI (公開鍵基盤) を構築することです。
PKIは以下の要素で構成されます。
- サーバーと各クライアントに必要な証明書(公開鍵とも呼ばれる)と秘密鍵
- 各サーバー証明書とクライアント証明書への署名に使用するマスター認証機関(CA)の証明書と鍵
OpenVPNは証明書に基づく双方向の認証をサポートしています。
即ち、相互に信頼された接続を確立するには、クライアントはサーバーの証明書を認証し、サーバーはクライアントの証明書を認証する必要があります。
サーバーとクライアントは、まず提示された証明書がマスター認証機関(CA)によって署名されている事を確認し、次に証明書ヘッダー内の共通名や認証タイプ等の情報を確認することで、お互いを認証します。
このセキュリティモデルには、VPNの観点から数多くの利点があります。
- サーバーは自身の証明書/キーさえ所有していれば良く、サーバーに接続する可能性のある全てのクライアントの証明書を知る必要はありません。
- サーバーは、マスター認証機関(CA)によって署名された証明書を持つクライアントのみを受け入れます。
また、サーバーはCA秘密鍵自体にアクセスすることなく署名検証を実行できるため、PKI全体の中で最も機密性の高い鍵であるCA鍵が全く別のマシン、さらにはネットワークに接続されていないマシン上に存在していても問題としません。 - 秘密鍵に問題があった場合、その証明書をCRL(certificate revocation list / 証明書失効リスト)に追加することで無効化できます。
CRLを使用することで、PKI全体を再構築することなく、問題のあった証明書を選択的に拒否することが可能です。 - サーバーは証明書に埋め込まれた特定フィールド(共通名など)に基づいて、クライアント固有のアクセス権を適用できます。
マスター認証機関(CA)の証明書と鍵の生成
このセクションでは、マスターCAの証明書と鍵、サーバーの証明書と鍵、および3台の個別クライアントそれぞれの証明書と鍵を生成する方法を説明します。
PKI管理にはOpenVPN2.2.x以前にバンドルされているスクリプトセットであるeasy-rsa2を使用します。
OpenVPN2.3.xをお使いの場合は、easy-rsa-oldプロジェクトページからeasy-rsa2を別途ダウンロードする必要がある場合があります。
※NIXプラットフォームでは、代わりにeasy-rsa3の使用を検討してください。
詳細はeasy-rsa3のドキュメントを参照してください。
Linux、BSD、Unix系OSを使用している場合は、シェルを開きcdコマンドでOpenVPNを配置したディレクトリのeasy-rsaサブディレクトリに移動してください。
OpenVPNをRPMまたはDEBファイルからインストールした場合、easy-rsaディレクトリは通常/usr/share/doc/packages/openvpn、もしくは/usr/share/doc/openvpnにあります。
※編集前に、このディレクトリを/etc/openvpnなどの別の場所にコピーしておくことをお勧めします。
パッケージのアップグレード等で内容変更された際に上書きされるのを防ぎます。
.tar.gzファイルからインストールした場合、easy-rsaディレクトリは展開されたソースツリーの一番上のディレクトリにあります。
Windowsをお使いの場合は、コマンドプロンプトを開きcdコマンドで\Program Files\OpenVPN\easy-rsaに移動します。
以下のバッチファイルを実行して設定ファイルをコピーします。
これにより既存のvars.batファイルとopenssl.cnfファイルが上書きされます。
varsファイル(Windowsの場合はvars.batファイル)を編集し、KEY_COUNTRY、KEY_PROVINCE、KEY_CITY、KEY_ORG、KEY_EMAILの各パラメータを設定します。
これらのパラメータはブランクにしないでください。
次に、PKIを初期化します。
- Linux/BSD/Unixの場合:
./clean-all
./build-ca
- Windowsの場合:
clean-all
build-ca
最後にbuild-caコマンドを実行すると、opensslコマンドが呼び出され、認証機関(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の場合:
- Windowsの場合:
ほとんどのパラメータはデフォルトのままで問題ありません。
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 client2
./build-key client3
- Windowsの場合:
build-key client2
build-key client3
クライアントの鍵をパスワードで保護する場合はbuild-key-passコマンドを代わりに使用します。
また、各クライアントには別々のCommon Name(共通名)をプロンプトで入力する必要があります。(例:"client1","client2","client3")
各クライアントには必ずユニークである共通名を使用してください。
Diffie Hellmanパラメータの生成
OpenVPNサーバー用にDiffie Hellmanパラメータを生成する必要があります。
- Linux/BSD/Unixの場合:
- Windowsの場合:
コマンドを実行すると以下のように出力されます。
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 |
鍵を生成したら全てのファイルを必要とするマシンにコピーします。
重要なファイルなのでやりとりには充分注意してください。
上記例では簡易化するために全ての秘密鍵を同じ場所で生成しましたが、既存の安全なチャンネルがなくても別の方法でPKIを設定する事が可能です。
例として、クライアント証明書と鍵をサーバー上で生成する代わりに、クライアントにローカルで独自の秘密鍵を生成させ、証明書署名要求(CSR)を鍵署名マシンに送信させることも可能です。
この場合、鍵署名マシンはCSRを処理し、署名済みの証明書をクライアントに返すので、生成されたマシンのハードドライブから秘密の.keyファイルを取り出すことなく設定が可能となります。