認証局を作って遊んでみよう。その③：CAを作ってみよう

## はじめに
自分でCAを作って証明書運用を実現するため、[前々回](https://qiita.com/shupeluter/items/b1df86a53a5461170910)は前提となる環境の準備、[前回](https://qiita.com/shupeluter/items/a8ed36503600f106f1bc)はHTTPSの概念の学習をしてきました。今回は、導入した環境にいよいよ**認証局(CA)**を作っていきます。

なお、この記事は[前々回](https://qiita.com/shupeluter/items/b1df86a53a5461170910)導入した環境が既に手元にあることを前提に進めていきます。まだ準備されていない方は、参照の上、準備を完了させてください。

## CAを構築しよう

easy-rsaを利用してCAを構築します。今回の構築対象はこのおじさんです。まずはUbuntuにeasy-rsaをインストールします。対象のOSはWSLのUbuntuを想定しています。

```bash:easy-rsaのインストール
sudo apt-get update
sudo apt-get install easy-rsa

```

![CA構築対象.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/a775c2d9-30f1-bd76-b7f4-90ac767e8b13.png)

### CAのディレクトリ構成
easy-rsaを利用するには受け付けたカギを管理するためのデータ領域(ディレクトリ)が必要となります。以下に一覧を記載します。

なお、作業は一般ユーザで実行するものとし、ユーザのホームディレクトリを$HOME(≒~)として記載します。

|No.|ディレクトリ|用途
|--|--|--|
|1|$HOME/ca|CA全体の基準ディレクトリ。このディレクトリに必要なコマンド、設定ファイル、データが配置される想定
|2|$HOME/ca/pki|CAのデータディレクトリ、配下のディレクトリでサーバからのCSRおよび、CA自体の秘密鍵を管理する。|
|3|$HOME/ca/pki/private|CA自体の秘密鍵を管理する。|
|4|$HOME/ca/pki/reqs|サーバからのCSRを管理する。|

### 構築作業

さて、事前の説明が終わったので、本格的な構築作業に移りましょう。

#### 1. ディレクトリを作成する。
以下のコマンドを実行し、caの基準ディレクトリを作成する。
```bash:Ubuntu
mkdir $HOME/ca
chmod 700 $HOME/ca
ln -s /usr/share/easy-rsa/* $HOME/ca/
```

なお、このディレクトリはCAの大切なデータを管理するため、パーミッションは700とし、特定のユーザ以外は触れないようにする。（仮に、このディレクトリのファイルが漏洩すると、このCAの利用者全員に大きな影響が出る。)

最後の```ln -s /usr/share/easy-rsa/*```は easy-rsa配下のすべてのファイル、ディレクトリのシンボリックリンクの作成です。コピーではなくシンボリックリンクとすることで、本体が更新されると、利用しているCAも同時に更新されます。

この時点でのディレクトリ構造を確認しておきましょう。
```bash:Ubuntu
find $HOME/ca

/<PATH to HOME>/ca
/<PATH to HOME>/ca/openssl-easyrsa.cnf
/<PATH to HOME>/ca/x509-types
/<PATH to HOME>/ca/easyrsa
/<PATH to HOME>/ca/vars.example

```

#### 2. CAの初期化処理を実行する

以下のコマンドで、初期化処理を実行します。

```bash:Ubuntu
cd $HOME/ca
./easyrsa init-pki
```

以下の様なメッセージが出ることを確認

```bash:コマンド実行結果
nit-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /<PATH to HOME>/ca/pki
```

確認してみましょう

```bash:環境確認
find $HOME/ca

　/<PATH to HOME>/ca
　/<PATH to HOME>/ca/openssl-easyrsa.cnf
★/<PATH to HOME>/ca/pki
★/<PATH to HOME>/ca/pki/openssl-easyrsa.cnf
★/<PATH to HOME>/ca/pki/safessl-easyrsa.cnf
★/<PATH to HOME>/ca/pki/private
★/<PATH to HOME>/ca/pki/reqs
　/<PATH to HOME>/ca/x509-types
　/<PATH to HOME>/ca/easyrsa
　/<PATH to HOME>/ca/vars.example
```
pki関係の設定ファイル、ディレクトリが生成されていることがわかります。

#### 3. 基本設定ファイルを作成

easy-rsaは基準ディレクトリ(ここでは$HOME/ca)配下のvarsという名称のファイルに設定を保持します。今回は以下の内容のファイルを準備します。(viなどのエディタで作成してください)

```conf:$HOME/ca/vars
set_var EASYRSA_REQ_COUNTRY    "JP"
set_var EASYRSA_REQ_PROVINCE   "<都道府県名>"
set_var EASYRSA_REQ_CITY       "<市名>"
set_var EASYRSA_REQ_ORG        "<運用組織>"
set_var EASYRSA_REQ_EMAIL      "<運用者向けEmailアドレス>"
set_var EASYRSA_REQ_OU         "<所属組織名称>"
set_var EASYRSA_ALGO           "ec"
set_var EASYRSA_DIGEST         "sha512"
```
「EASYRSA_ALGO」暗号化アルゴリズムおよびチェックデジット方式を示す「EASYRSA_DIGEST」はそのままにしておいて下さい。

以下サンプルです

```conf:$HOME/ca/vars
set_var EASYRSA_REQ_COUNTRY    "JP"
set_var EASYRSA_REQ_PROVINCE   "Tokyo"
set_var EASYRSA_REQ_CITY       "Minatoku"
set_var EASYRSA_REQ_ORG        "My Corp"
set_var EASYRSA_REQ_EMAIL      "xxx@homtmail.com"
set_var EASYRSA_REQ_OU         "personal"
set_var EASYRSA_ALGO           "ec"
set_var EASYRSA_DIGEST         "sha512"
```

仮にこのサンプルをコマンドで作成する場合、以下のコマンドで作成可能です。
```bash:コマンドで作成
echo set_var EASYRSA_REQ_COUNTRY    \"JP\" > $HOME/ca/vars 
echo set_var EASYRSA_REQ_PROVINCE   \"Tokyo\" >> $HOME/ca/vars 
echo set_var EASYRSA_REQ_CITY       \"Minatoku\" >> $HOME/ca/vars 
echo set_var EASYRSA_REQ_ORG        \"My Corp\" >> $HOME/ca/vars 
echo set_var EASYRSA_REQ_EMAIL      \"xxx@homtmail.com\" >> $HOME/ca/vars 
echo set_var EASYRSA_REQ_OU         \"personal\" >> $HOME/ca/vars 
echo set_var EASYRSA_ALGO           \"ec\" >> $HOME/ca/vars 
echo set_var EASYRSA_DIGEST         \"sha512\" >> $HOME/ca/vars 

```

ここまでで、CA構築の準備は完了しました。続いて、caを作成します。

#### 5. CA構築

以下のコマンドを利用することでCAが構築され、利用可能になります。

```bash:CA構築
cd $HOME/ca
./easyrsa build-ca
```

```bash:実行状態
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

Enter New CA Key Passphrase:★1
Re-Enter New CA Key Passphrase:★1
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]:★2
```
★1では、CAの秘密鍵にパスフレーズを設定しています。任意の文字列を入力して下さい。今後、鍵にアクセスする必要があるすべての場面で入力を求められます。

★2ではCAの共通名(CN)を確認するように求められています。CNは、認証局のコンテキストでこのマシンを参照するために使用される名前です。任意の文字列を入力できますが、簡単にするために、Enterキーを押してデフォルト名(Easy-RSA CA)を利用します。
最終的に以下のメッセージが出力されるとこの作業は終了です。

```bash:コマンド終了メッセージ
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/<PATH to Home>/ca/pki/ca.crt
```

このca.crtが「CA証明書」です。先ほどの図で言えば、この証明書に当たります。

![CRTの正体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/5e86b293-c9c2-c047-6568-e7059f59c48d.png)

CAは今後、ユーザの求めに応じて、このca.crtファイルを提供する必要があります。(普通に配布するのですが。)

ここまでで、CAの構築は完了です。次回はいよいよサーバ証明書を作成し、ブラウザからのhttpsアクセスが完了するまでを行います。楽しみにして置いてください。



## おまけ
### ホスト側のWindowsでWSL(=Ubuntu)のディレクトリからca.crtを取得する
ca.crtをhttps接続するクライアント端末(ブラウザ美)に渡さなくてはいけません。そのためには何らかの方法でこのca.crtを取得する必要があります。今回は、ホスト側のWindowsで先ほど作成したCA証明書を取得する方法をご紹介します。

1. エクスプローラーを立ち上げます。
2. アドレスバーに **\\wsl$**を入力します
![wslからファイル取得1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/848036fa-8cfe-db7f-bd64-5d183e88a948.jpeg)
3. リナックスディストリビューションを選択します。
4. <PATH to Home>/ca/pki と順番にたどります。ありました。ca.crtです。
![wslからファイル取得3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/3fdef9e8-8523-30fe-0eec-ceba276584b0.jpeg)
5. あとは右クリックコピーして、任意のフォルダに格納してください。「ダウンロード」あたりがお勧めです。

## まとめ
今回の作業でCAが使えるよになりました。次回は、Webサーバから署名依頼から、NGINXへの証明書ファイルの設定までを行います。お楽しみに。

[＜＜前の記事　　](https://qiita.com/shupeluter/items/a8ed36503600f106f1bc) [　　次の記事＞＞]()