Client VPN に使う証明書を Windows で (=WSL を使わずに) 生成してみた

WSL も使わずに Windows 環境だけで Client VPN で使用する証明書を生成してみました。
2020.07.07

みなさま Xin chao !

 

AWS Client VPN (以下 Client VPN) では、AWS Certificate Manager (以下 ACM) にインポートしたサーバー証明書が必要になります。

また、相互認証を使用する場合には、クライアント証明書も必要になります。

クライアント VPN エンドポイントを作成する - AWS VPN 管理者ガイド

 

Client VPN の導入を機に初めて証明書を生成する場合でも、AWS をはじめとする様々なドキュメントを見ながら比較的容易に自己証明書を生成することができます。

相互認証 - AWS VPN 管理者ガイド

 

そのドキュメント ↑ ですが、いつの間にか Windows 環境での証明書生成手順が掲載されていました (私の記憶では以前は Linux 環境での生成手順しかなかったような気が...)。

そこで今回は Client VPN で使用するサーバー証明書とクライアント証明書を、実際に Windows 環境で (=WSL を使わずに) 生成してみたいと思います。

やってみた

環境

今回は、以下の環境で試しています。

接続元 PC の OS Windows Server 2019 (EC2) ※ Windows 10 Pro バージョン 1909 でも接続を確認済みです
VPN クライアントアプリケーション OpenVPN クライアント 2.4.9
認証方式 相互認証 (=クライアント証明書)
証明書生成環境 Windows Server 2019 (EC2) + OpenVPN クライアントと共にインストールした EasyRSA 2
クライアント証明書の保存先 接続元 PC のローカルフォルダ (C:\Certs)
接続元 PC の利用者 ローカル管理者権限あり (=ローカルの Administrators グループに所属)

 事前準備

証明書の生成には、OpenVPN クライアントアプリケーションと共にインストール可能な EasyRSA 2 を使用します。

OpenVPN クライアントアプリケーションは、以下のサイトよりダウンロード可能です。 事前に 「Windows インストーラ (Windows 10 用)」 をダウンロードしておきます。

OpenVPN 日本語サイト

OpenVPN クライアントアプリケーションのインストール

証明書生成環境となる Windows Server 2019 上で、OpenVPN クライアントアプリケーションのインストーラを実行します。

インストール時の注意点として、インストールするコンポーネントで、"EasyRSA 2 Certificate Management Scripts" を追加することを忘れないようにします。

証明書の生成

証明書生成環境となる Windows Server 2019 上で、証明書生成環境をセットアップしていきます。 コマンドプロンプトを [管理者として実行] します。

OpenVPN クライアントアプリケーションをインストールしたフォルダに移動します。

C:\Users\Administrator>cd "\Program Files\OpenVPN\easy-rsa"

init-config.bat を実行します。 実行すると vars.bat.sample ファイルが vars.bat ファイルとしてコピーされます。

C:\Program Files\OpenVPN\easy-rsa>init-config.bat

C:\Program Files\OpenVPN\easy-rsa>copy vars.bat.sample vars.bat
        1 個のファイルをコピーしました。

コピーされた vars.bat をメモ帳で開きます。

C:\Program Files\OpenVPN\easy-rsa>notepad.exe vars.bat

 

vars.bat の内容の KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL の値を以下のように変更し、保存します。

(変更前)

 

(変更後)

 

[管理者として実行] しているコマンドプロンプトで、変更後の vars.bat を実行します。

C:\Program Files\OpenVPN\easy-rsa>vars.bat

 

clean-all.bat を実行します (初回実行時には "指定されたファイルが見つかりません。" と表示されますが、無視して問題ありません)。

C:\Program Files\OpenVPN\easy-rsa>clean-all.bat
指定されたファイルが見つかりません。
        1 個のファイルをコピーしました。
        1 このファイルをコピーしました。

 

build-ca.bat を実行し、新しい認証機関 (CA) を構築します。 Country Name 等の入力を求められますが、そのまま [Enter] キーを押し、Common Name のみ入力します。 今回は自己証明書生成環境のため、実在しないドメイン名を入力しました。

C:\Program Files\OpenVPN\easy-rsa>build-ca.bat
Can't load C:\Program Files\OpenVPN\easy-rsa/.rnd into RNG
4148:error:2406F079:random number generator:RAND_load_file:Cannot open file:crypto/rand/randfile.c:98:Filename=C:\Program Files\OpenVPN\easy-rsa/.rnd
Generating a RSA private key
..........................................................+++++
.......................................................................+++++
writing new private key to 'keys\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) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Chiyoda-ku]:
Organization Name (eg, company) [Classmethod, Inc.]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [changeme]:masawo-cvpn.test
Name [changeme]:
Email Address [masawo@classmethod.jp]:

 

build-key-server.bat を実行し、サーバー証明書と秘密キーを生成します。 Country Name 等の入力を求められますが、そのまま [Enter] キーを押し、Common Name のみ入力します。 認証機関 (CA) 構築時に指定したのと同じドメイン名で指定しました。 最後に 2 回確認を求められますので、いずれも y を入力します (何も入力せずに Enter を押してしまうと n と同じ意味になります)。

C:\Program Files\OpenVPN\easy-rsa>build-key-server.bat server.masawo-cvpn.test
Ignoring -days; not generating a certificate
Generating a RSA private key
..................................................................................................+++++
...................+++++
writing new private key to 'keys\server.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) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Chiyoda-ku]:
Organization Name (eg, company) [Classmethod, Inc.]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [changeme]:server.masawo-cvpn.test
Name [changeme]:
Email Address [masawo@classmethod.jp]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'Tokyo'
localityName          :PRINTABLE:'Chiyoda-ku'
organizationName      :PRINTABLE:'Classmethod, Inc.'
organizationalUnitName:PRINTABLE:'changeme'
commonName            :PRINTABLE:'server.masawo-cvpn.test'
name                  :PRINTABLE:'changeme'
emailAddress          :IA5STRING:'masawo@classmethod.jp'
Certificate is to be certified until Jun 28 09:38:39 2030 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

 

クライアント証明書と秘密キーを生成するため、build-key.bat を実行します。 Country Name 等の入力を求められますが、そのまま [Enter] キーを押し、Common Name のみ入力します。 認証機関 (CA) 構築時に指定したのと同じドメイン名で指定しました。 最後に 2 回確認を求められますので、いずれも y を入力します (何も入力せずに Enter を押してしまうと n と同じ意味になります)。

C:\Program Files\OpenVPN\easy-rsa>build-key.bat client01.masawo-cvpn.test
Ignoring -days; not generating a certificate
Generating a RSA private key
......................................................+++++
.............................................................................................................................................+++++
writing new private key to 'keys\client.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) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Chiyoda-ku]:
Organization Name (eg, company) [Classmethod, Inc.]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [changeme]:client01.masawo-cvpn.test
Name [changeme]:
Email Address [masawo@classmethod.jp]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'JP'
stateOrProvinceName :PRINTABLE:'Tokyo'
localityName :PRINTABLE:'Chiyoda-ku'
organizationName :PRINTABLE:'Classmethod, Inc.'
organizationalUnitName:PRINTABLE:'changeme'
commonName :PRINTABLE:'client01.masawo-cvpn.test'
name :PRINTABLE:'changeme'
emailAddress :IA5STRING:'masawo@classmethod.jp'
Certificate is to be certified until Jun 28 09:45:35 2030 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

 

C:\Program Files\OpenVPN\easy-rsa\keys フォルダを確認すると、Client VPN に必要な認証機関 (CA) 証明書, サーバー証明書と秘密キー, クライアント証明書と秘密キーが生成されています。

 

ACM への証明書のインポート

今回は、AWS マネジメントコンソールを使って、ACM にサーバー証明書をインポートしてみます。 ACM のコンソールを開き [証明書のインポート] をクリックします。

それぞれの入力欄には、以下のファイルの内容をコピーします (ファイルの内容はメモ帳等で確認できます)。

  • 証明書本文 ・・・ サーバー証明書 (eg. server.masawo-cvpn.test.crt)
  • 証明書のプライベートキー ・・・ サーバー証明書秘密キー (eg. server.masawo-cvpn.test.key)
  • 証明書チェーン ・・・ CA 証明書 (eg. ca.crt)

 

インポートが完了しました。

 

今回のように、サーバー証明書とクライアント証明書が同一の認証機関 (CA) から発行されている場合、クライアント証明書については ACM にインポートする必要はありません。

クライアント証明書を ACM にアップロードする必要があるのは、クライアント証明書の CA がサーバー証明書の CA と異なる場合だけです。

相互認証 - AWS VPN 管理者ガイド より抜粋

 

Client VPN エンドポイントの作成

Client VPN エンドポイントは、AWS のドキュメントをもとに、相互認証を使用するように作成します。

クライアント VPN エンドポイント - AWS VPN 管理者ガイド

 

作成後、Client VPN クライアント設定ファイル (.ovpn) を、ダウンロードしておきます。

 

Client VPN クライアントの設定

今回は、Client VPN クライアントの C:\Certs フォルダにクライアント証明書 (client01.masawo-cvpn.test.crt と client01.masawo-cvpn.test.key) を保存しましたので、Client VPN クライアント設定ファイルに以下を追記します (フォルダの区切りである \ は 2 つ続けて \ と記載することを忘れずに)。

cert C:\\Certs\\client01.masawo-cvpn.test.crt

key C:\\Certs\\client01.masawo-cvpn.test.key

 

また、AWS のドキュメントをもとに、Client VPN エンドポイントの DNS 名を変更することも忘れないようにします。

ステップ 6: クライアント VPN エンドポイントの設定ファイルをダウンロードする - クライアント VPN の開始方法

(変更前の例)

remote cvpn-endpoint-0123456789ABCDEF0.prod.clientvpn.us-east-1.amazonaws.com 443

(変更後の例)

remote asdfa.cvpn-endpoint-0123456789ABCDEF0.prod.clientvpn.us-east-1.amazonaws.com 443

 

編集後の Client VPN クライアント設定ファイルを、以下のフォルダに保存します。

C:\Program Files\OpenVPN\config

Client VPN エンドポイントに接続

ここまでで準備が整いましたので、VPN 接続してみたいと思います。

証明書を生成した環境にはすでに OpenVPN クライアントアプリケーションがインストールされていますので、それを使って接続テストしてみます。

タスクトレイの OpenVPN GUI アイコンを右クリック → [接続] をクリックして、VPN 接続します。

無事に接続できました。

さいごに

WSL も使わずに、Windows だけで Client VPN で使用するサーバー証明書とクライアント証明書を生成してみました。

AWS のドキュメントをはじめとする各種ドキュメントに証明書生成手順は紹介されており、Linux に詳しくなくても、WSL 環境さえセットアップできれば Windows PC で証明書を生成することは可能ですが、様々な事情により WSL を使うことができない場合もあると思い、また、Windows だけで証明書を生成している情報も少なかったので、今回実際に試してみました。

 

このブログを書いている本日は 7 月 7 日です。

世間的には「七夕」の日として知られている日かと思いますが、弊社社内では「クラスメソッド創立記念日」一色となる日です!

クラスメソッド創業16周年のごあいさつ 〜支援実績2,000社、AWSアカウント数8,800件達成〜