5分で自己署名証明書をCloudShellで作成&AWS ACMに登録する方法

この記事を書いたメンバー:

榊原慶太

5分で自己署名証明書をCloudShellで作成&AWS ACMに登録する方法

目次

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 ハンズオン

カテゴリー
タグ

この記事を書いたメンバー

榊原慶太
榊原慶太

技術検証、re:Invent参加、AWS資格全冠のための勉強教材等、幅広く記事にしています。皆様のお役に立てば幸いです。最近は会社ブログメインで記事投稿しています。

SAPシステムや基幹システムのクラウド移行・構築・保守、
DXに関して
お気軽にご相談ください

03-6260-6240 (受付時間 平日9:30〜18:00)