おはようございます!マネジメントオフィスいまむらの今村敦剛です。
この度、IDCフロンティアのIaaS型パブリッククラウドサービスを使い、OpenVPNサーバを構築しました。その構築方法を記録する第6回目です。今回は、サーバとクライアントのVPN通信に必要な鍵と証明書の作成をします。
この連載の全体的な構成
この連載は、全10回を予定しています。今回は第6回目「鍵・証明書作成」です。
連載記事一覧
- 全体構想
- IaaS設定 - 仮想マシン作成
- IaaS設定 - IaaSネットワーク設定
- IaaS設定 - 操作環境整備
- IaaS設定 - DDNS設定
- VPNサーバ設定 - インストール
- VPNサーバ設定 - 鍵・証明書作成
- VPNサーバ設定 - server.conf作成
- VPNクライアント設定 - 鍵・証明書作成
- VPNクライアント設定 - client.ovpn作成
- VPNクライアント設定 - windows自動起動設定
OpenVPNを使う証明書と鍵のイメージ
OpenVPNで、サーバがクライアントの認証に使うのはSSL認証です。一般的なユーザーIDとパスワードの組み合わせよりも、もっと安全な方法です。SSL認証をするためには「証明書」や「鍵」の役割を果たすファイルが必要になります。
SSL認証のやり方は複雑ですが、ごく簡単に説明すると、下記の図のようなイメージです。認証局は、サーバー証明書が正しいことを認証する役割を果たしています。そして認証局、サーバ、クライアントの3者それぞれが該当する鍵や証明書を持ち寄ることで、通信相手が正しいことを確認しています。
今回は、これらの鍵を作成していきます。
認証局の作成とCA証明書・CA鍵の作成
それでは早速、認証局を作成し、CA証明書とCA鍵を生成しましょう。最初のステップは、適切なディレクトリに移動することです。(ちなみに3.0.8というディレクトリ名は、バージョンによって変わる可能性がありますので、その点注意してくださいね)
command
cd /usr/share/easy-rsa/3.0.8
次に、「easyrsa init-pki」コマンドを実行し、認証局を初期化します。
command
./easyrsa init-pki
これで/usr/share/easy-rsa/3.0.8/に、新たに「pki」というディレクトリが生まれます。
さらに、「easyrsa build-ca」コマンドを走らせて、認証局を作成します。
command
./easyrsa build-ca
この過程で「pass phrase」と「Common Name(認証局の名前)」を入力しろと言われます。
後で混乱を避けるためにも、管理しやすい(≒自分が忘れないような)パスフレーズと名前を選びましょう。ここで設定したpass phraseとCommon Nameは、後々サーバやクライアントの証明書や秘密鍵を作る際に必要になります。
なお、認証局が完成すると、以下のディレクトリに認証局の秘密鍵と証明書が生成されます。
- 認証局(CA)の秘密鍵:/usr/share/easy-rsa/3.0.8/pki/private/ca.key
- 認証局(CA)の証明書:/usr/share/easy-rsa/3.0.8/pki/ca.crt
これらの証明書は、後でOpenvpnのディレクトリに移動させるんですが、今はただ作成されたことを確認するだけで大丈夫です。
サーバの秘密鍵と証明書の作成
お次は、OpenVPNサーバの秘密鍵と証明書の作成です。
「easyrsa build-server-full」コマンドを使って、OpenVPNサーバの秘密鍵と証明書を生成します。
command
./easyrsa build-server-full server nopass
上記のコマンド内の「server」は、秘密鍵と証明書のファイル名になりますので、お好きな名称に変えることもできます。また「nopass」というパラメーターをつけると、サービス起動時にパスワードを尋ねてこないようになります。セキュリティレベルは落ちるかもしれませんが、今回のぼくの用途ではパスワードは不要なので、「nopass」のパラメーターをつけています。
このとき、先ほど設定した認証局のパスフレーズを入力するように求められるので、忘れずに入力してください。
コマンドが無事に実行されれば、OpenVPNサーバの証明書と秘密鍵が以下のディレクトリに新しく作成されます。
- OpenVPNサーバの秘密鍵:/usr/share/easy-rsa/3.0.8/pki/private/server.key
- OpenVPNサーバの証明書:/usr/share/easy-rsa/3.0.8/pki/issued/server.crt
クライアントの秘密鍵と証明書の作成
さあラストスパートです。「easyrsa build-client-full」コマンドを実行して、クライアントの秘密鍵と証明書を作成しましょう。
command
./easyrsa build-client-full client nopass
コマンドの「client」の部分には、お好みのクライアント名を設定できます。今回は説明のために「client」とだけにしていますが、クライアントが複数台ある場合には、わかりやすいように連番をつけるのも良いでしょう(例えばclient1, client2といった具体的な名前ですね)。
再度、コマンドを実行する際には先ほど設定した認証局のパスフレーズの入力が必要になるので、忘れないように注意してくださいね。
さらに、ここでも「nopass」のパラメーターをつけています。これにより、クライアントの接続時にパスワードの入力が不要となります。
コマンドが正常に実行されると、クライアントの証明書と秘密鍵が新しく作成されます。
- クライアントの証明書:/usr/share/easy-rsa/3.0.8/pki/issued/client.crt
- クライアントの秘密鍵:/usr/share/easy-rsa/3.0.8/pki/private/client.key
さらに、TLS-Auth用共有鍵を作成しましょう。これはオプションですが、セキュリティレベルが上がるため作成しておくことをお勧めします。(DoS攻撃への対策になるんですよ)
command
openvpn --genkey --secret ta.key
コマンドが正常に実行されれば、以下のディレクトリに新しいTLS鍵が生成されます。
- TLS-Auth⽤共有鍵:/usr/share/easy-rsa/3.0.8/ta.key
そして最後に、DHパラメータの生成です。DH法(Diffie-Hellman鍵共有法)は、第三者に鍵を知られずに受信者へ伝えるための技術だそうです。
command
./easyrsa gen-dh
少し時間がかかりますが、コマンドが正常に実行されれば、以下のディレクトリに新しいTLS鍵が生成されます。
- dh.pem /usr/share/easy-rsa/3.0.8/pki/
これでvpnの設定に必要な鍵・証明書関係ができました😊
鍵・証明書のありかについて
以上の作業で作成された鍵・証明書は、下記のディレクトリに所在しているはずです。(3.0.8というディレクトリ名は、バージョンによって変わりますので気をつけてください)。
これらが全て作成されていることを確認しておくと安心ですね。(作成されていなければ、前に戻って該当する証明書と鍵を作成しておいてください)
- ca.crt /usr/share/easy-rsa/3.0.8/pki/
- server.key /usr/share/easy-rsa/3.0.8/pki/private
- server.crt /usr/share/easy-rsa/3.0.8/pki/issued
- dh.pem /usr/share/easy-rsa/3.0.8/pki/
- ta.key /usr/share/easy-rsa/3.0.8/
- ca.key /usr/share/easy-rsa/3.0.8/pki/private
- client.key /usr/share/easy-rsa/3.0.8/pki/private
- client.crt /usr/share/easy-rsa/3.0.8/pki/issued