目次
BeeXの榊原です。今回は表題の件について解説記事を出します。実際に操作を行ったのはもう半年以上前のことです。しかし最近再度操作する機会があり、パッとやり方を思い出せなかったのでここでアウトプットします。Client VPNの動作確認等にご利用ください。慣れてしまえばタイトル通り5分程度で一連の操作は可能です。CloudShellには既にアクセス済みとします。
手順
CloudShellにアクセスして下記コマンドを順に入力していきます。
もし途中でエラーが出た際は、カレントディレクトリを確認してください。
# 必要なソフトをインストールします
$ sudo yum install openssl -y
$ git clone https://github.com/OpenVPN/easy-rsa.git
##### 以下出力結果 #####
Cloning into 'easy-rsa'...
remote: Enumerating objects: 7716, done.
remote: Counting objects: 100% (2491/2491), done.
remote: Compressing objects: 100% (1146/1146), done.
remote: Total 7716 (delta 1386), reused 2043 (delta 1313), pack-reused 5225 (from 1)
Receiving objects: 100% (7716/7716), 52.71 MiB | 22.54 MiB/s, done.
Resolving deltas: 100% (3634/3634), done.
##### 出力結果ここまで #####
これでeasy-rsaが環境にインストールされますので確認しましょう。
$ ls
##### 以下出力結果 #####
easy-rsa
次に証明書の有効期限を設定しましょう。今回は365日想定で作成しています。
# 証明書の有効期限設定
$ cd easy-rsa/easyrsa3
$ cp -p vars.example vars
$ echo set_var EASYRSA_CA_EXPIRE 365 >> vars
$ echo set_var EASYRSA_CERT_EXPIRE 365 >> vars
$ echo set_var EASYRSA_CRL_DAYS 365 >> vars
# 設定した有効期限を確認
$ cat vars | grep -Ev "^[[:space:]]*(#|$|if|fi|echo|return)"
##### 以下出力結果 #####
set_var EASYRSA_CA_EXPIRE 365
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_CRL_DAYS 365
上記設定を基に証明書を作成します。まずPKIを初期化します
$ ./easyrsa init-pki
##### 以下出力結果 #####
Using Easy-RSA 'vars' configuration:
* /home/cloudshell-user/easy-rsa/easyrsa3/vars
Notice
------
'init-pki' complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki
Using Easy-RSA configuration:
* /home/cloudshell-user/easy-rsa/easyrsa3/vars
CAを作成します。
$ ./easyrsa build-ca nopass
##### 以下出力結果(途中何も入力せずEnterを押す) #####
Using Easy-RSA 'vars' configuration:
* /home/cloudshell-user/easy-rsa/easyrsa3/vars
.......+..+......+...............+.+.....+.........+.+.....+.+.................+.+..+....+.........+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+..+...+.+.....+.......+.....+...+.+.....+...+............+.+........+.......+.....+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+.....+....+..........................+.........+.+...+......+..+...+......+.+...............+...+..+....+......+..............+.+........+....+...+.................+..........+.....+......+......+.........+......+....+.....+......+.+..+.............+.....+...+................+...+............+.........+..+.......+..+.+...............+..+.+......+........+...+.......+......+..............+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
........+.....+...+.+..+............+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*......+...........+....+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+.......+..+................+......+......+.........+........+......+.+.........+.....+.+........+...+....+......+.....+...+.......+..+................+..+....+...+...+...+.....................+...............+......+.....+..........+.....+.......+..+....+..............+.+..+....+...........+....+.......................+...+.........+.........+.+.....+.+........+....+..+.+...+......+...+......+.....+.+........+...+............+......+.+...............+......+.....+...+.+...+........+.............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
Notice
------
CA creation complete. Your new CA certificate is at:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/ca.crt
Create an OpenVPN TLS-AUTH|TLS-CRYPT-V1 key now: See 'help gen-tls'
Build-ca completed successfully.
サーバー用の秘密鍵と証明書を作成します
$ ./easyrsa --san=DNS:vpn-server build-server-full vpn-server nopass
##### 以下出力結果(途中yesと入力) #####
Using Easy-RSA 'vars' configuration:
* /home/cloudshell-user/easy-rsa/easyrsa3/vars
.....+.........+.+......+.....+.......+.....+...+.........+......+............+......+....+...+........+.+..........................+...+......+......+.......+........+.........+..........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...........+......+.+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.............+..............+....+..+...+.+..............+..........+...+........+.+...+...+............+......+..+....+..............+.......+...+..+.......+.....+......+......+.+..+...+....+.....+.............+...............+......+...........+...+.+..+.......+........+.......+...+..+.+.....+.+.....+.+..+......+......+.........+....+...+........+.........................+..+..........+..+.+..+....+.....+.+...+......+....................+......+.......+........+.......+.....+..........+.....+...+....+.........+.....+......+.........+.......+...+.....+.+...........+...+.......+...+.........+............+...+..+....+..............+.+..+...+....+..+.........+..........+.....+.+........+...+...+....+..+.+...+..+.......+.....+............+....+.........+........+....+.....+.+...+............+..+.+..............+...+...+......................+.....+....+.........+......+......+.....+...+...............+.+........+.+.....+......+.+..+..........+..+....+..+.............+......+.....+...+.......+...+...........+.........+............+......+...+....+...+..+.......+......+...+.........+..+....+...........+......+...+.........+......+.+..............+.....................+.+.........+...+..+............................+.....+......+.......+.....+..........+..+.......+.....+.+.....+....+.....+.+............+......+...........+..........+.....+...+.+..+.......+......+.....+....+..+...............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+...+......+.+........+.+..+............+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.+..+...+.........+....+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /home/cloudshell-user/easy-rsa/easyrsa3/pki/reqs/vpn-server.req
* key: /home/cloudshell-user/easy-rsa/easyrsa3/pki/private/vpn-server.key
You are about to sign the following certificate:
Requested CN: 'vpn-server'
Requested type: 'server'
Valid for: '365' days
subject=
commonName = vpn-server
X509v3 Subject Alternative Name:
DNS:vpn-server
Type the word 'yes' to continue, or any other input to abort.
Confirm requested details: yes
Using configuration from /home/cloudshell-user/easy-rsa/easyrsa3/pki/8270e558/temp.7.1
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'vpn-server'
Certificate is to be certified until Nov 3 05:17:18 2025 GMT (365 days)
Write out database with 1 new entries
Data Base Updated
/usr/bin/which: no bc in (/home/cloudshell-user/.local/bin:/home/cloudshell-user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/node_modules/aws-cdk/bin:/home/cloudshell-user/.local/bin)
Notice
------
Inline file created:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/inline/private/vpn-server.inline
Notice
------
Certificate created at:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/issued/vpn-server.crt
クライアント用の秘密鍵と証明書を作成します。
$ ./easyrsa --san=DNS:vpn-client build-client-full vpn-client nopass
##### 以下出力結果 #####
Using Easy-RSA 'vars' configuration:
* /home/cloudshell-user/easy-rsa/easyrsa3/vars
...+...+..............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+.+.........+........+...+....+...+...+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+.....+......+.+.........+..+..........+...+.....+.......+..+.+............+........+.+...+...+...+..+...+.........+.+..+....+........+..........+......+......+...+.....+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
...+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+.......+......+............+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+....+...+...+.....+.........+...+..........+......+.........+.....+.......+..............+.+.....+...............+......+.......+..+....+..+.........+.+..............+....+..+...+.......+.........+........+............+....+..+.......+........+...+.+.....................+...+...............+......+...+...+........+......+.+..................+.....+.........+......+.+......+............+..+...+.......+........+......+.........+...+...+....+............+......+.....+....+.....+.+..+...+.........................+...+..+.......+..+...+..........+...+........+......+..................+......+.+...+...........+......+.+.....+.......+...............+............+......+..+..............................+......+....+.................+.+.....+...+.........+.+..+...............+....+...+........+....+.....+..........+.....+......+...+....+...+.....+.......+.................+.+.....+.......+.....+.+.....+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /home/cloudshell-user/easy-rsa/easyrsa3/pki/reqs/vpn-client.req
* key: /home/cloudshell-user/easy-rsa/easyrsa3/pki/private/vpn-client.key
You are about to sign the following certificate:
Requested CN: 'vpn-client'
Requested type: 'client'
Valid for: '365' days
subject=
commonName = vpn-client
X509v3 Subject Alternative Name:
DNS:vpn-client
Type the word 'yes' to continue, or any other input to abort.
Confirm requested details: yes
Using configuration from /home/cloudshell-user/easy-rsa/easyrsa3/pki/3dfcdf5d/temp.7.1
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'vpn-client'
Certificate is to be certified until Nov 3 05:19:33 2025 GMT (365 days)
Write out database with 1 new entries
Data Base Updated
/usr/bin/which: no bc in (/home/cloudshell-user/.local/bin:/home/cloudshell-user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/node_modules/aws-cdk/bin:/home/cloudshell-user/.local/bin)
Notice
------
Inline file created:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/inline/private/vpn-client.inline
Notice
------
Certificate created at:
* /home/cloudshell-user/easy-rsa/easyrsa3/pki/issued/vpn-client.crt
作成した各秘密鍵、証明書を確認してみましょう。秘密鍵はprivateディレクトリに、証明書はissuedディレクトリにあります。ここまでのディレクトリ構造は以下の通りです。一部省略しています。
.
└── easy-rsa
└── easyrsa3
└── pki
├── ca.crt
├── issued
│ ├── vpn-client.crt
│ └── vpn-server.crt
└── private
├── ca.key
├── vpn-client.key
└── vpn-server.key
それでは仕上げにAWS ACMに証明書を登録しましょう。参考にコマンド実行時のカレントディレクトリも追記します。
# カレントディレクトリ確認
$ pwd
##### 以下出力結果 #####
/home/cloudshell-user/easy-rsa/easyrsa3
##### 出力結果ここまで #####
# サーバー用証明書の登録
$ aws acm import-certificate \
--certificate fileb://pki/issued/vpn-server.crt \
--private-key fileb://pki/private/vpn-server.key
--certificate-chain fileb://pki/ca.crt
##### 以下出力結果 #####
{
"CertificateArn": "arn:aws:acm:ap-northeast-1:XX:certificate/XX"
}
##### 出力結果ここまで #####
# サーバー用証明書の登録
$ aws acm import-certificate \
--certificate fileb://pki/issued/vpn-client.crt \
--private-key fileb://pki/private/vpn-client.key \
--certificate-chain fileb://pki/ca.crt
##### 以下出力結果 #####
{
"CertificateArn": "arn:aws:acm:ap-northeast-1:XX:certificate/XX"
}
証明書が登録されているか確認しましょう。
$ aws acm list-certificates --query \
"CertificateSummaryList[?contains(DomainName, 'vpn-client') \
|| contains(DomainName, 'vpn-server')].{CertificateArn:CertificateArn, DomainName:DomainName}"
##### 以下出力結果 #####
[
{
"CertificateArn": "arn:aws:acm:ap-northeast-1:XX:certificate/XX",
"DomainName": "vpn-server"
},
{
"CertificateArn": "arn:aws:acm:ap-northeast-1:XX:certificate/XX",
"DomainName": "vpn-client"
}
]
コンソール画面にも表示されています。問題なさそうです。
最後に
今回は検証用に素早く自己署名証明書を作成する方法を記載しました。これでもう2度と忘れることは無いと思います。本記事がどなたかのお役に立てば幸いです。
参考URL
easy-rsa
Enable mutual authentication for AWS Client VPN
AWS Client VPN Basic ハンズオン