おうちサーバー構築報告：オレオレ認証局とサーバー証明書

## 能書き

[おうちサーバー構築報告：予告](https://qiita.com/katz_engineer/items/471408eda1d09507c451)からのおうちサーバー構築の続きです。

オレオレ認証局の構築は[以前](https://qiita.com/katz_engineer/items/ff07466662131b72c14c)もやりましたが、今回はシェルスクリプトにまとめてみました。

認証局の概要は[以前](https://qiita.com/katz_engineer/items/ff07466662131b72c14c#%E6%A6%82%E8%A6%81%E8%AA%AC%E6%98%8E%E3%81%A8%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE)の記事を参照して下さい。今回は省略します。

### 目標

- easy-rsaを使用してルート認証局を作る所までを実施
- 一連のコマンド操作をシェルスクリプト化

### 参考文献

- [私的サーバー構築日誌：オレオレ認証局 - Qiita](https://qiita.com/katz_engineer/items/ff07466662131b72c14c)
- [自宅サーバー構築譚：オレオレ認証局 - Qiita](https://qiita.com/katz_engineer/items/ada7b08e7c0254e39126)
- [私的サーバー構築日誌：オレオレ認証局が認証する証明書 - Qiita](https://qiita.com/katz_engineer/items/fe954644fa570093ca3a)
- [自宅サーバー構築譚：オレオレ認証局が認証する証明書 - Qiita](https://qiita.com/katz_engineer/items/1bb165f5f59c43c0ab6a)

## 認証局の構築

```console:マシン172.16.1.101:ユーザーroot
cd
cat <<"___" >buildCert.sh
CA_USER=$1

apt update
apt upgrade -y
apt install -y easy-rsa
cd /etc
svn st | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -t svn add
svn ci -m"install Easy RSA"

useradd -m -s /bin/bash $CA_USER
svn ci -m"add user $CA_USER" /etc
___
chmod 755 buildCert.sh
```

```console:マシン172.16.1.101:ユーザーroot
./buildCert.sh cert
```

```console:マシン172.16.1.101:ユーザーroot
su - cert
```

```console:マシン172.16.1.101:ユーザーcert
cat <<"___" >buildCA.sh
#!/bin/bash
CA_NAME=$1
CA_EXPIRE=$2

cd
mkdir $CA_NAME
cd $CA_NAME
ln -s /usr/share/easy-rsa/* .
./easyrsa init-pki
cat <<___A >vars
set_var EASYRSA_ALGO      "ec"
set_var EASYRSA_DIGEST    "sha512"
set_var EASYRSA_CA_EXPIRE $CA_EXPIRE
set_var EASYRSA_CERT_EXPIRE $CA_EXPIRE
___A
./easyrsa build-ca
___
chmod 755 buildCA.sh
```

```console:マシン172.16.1.101:ユーザーcert
CA_NAME=demoCA
./buildCA.sh $CA_NAME 36524
```

このシェルスクリプト`buildCA.sh`を実行すると、キーペアのパスフレーズを入力するように求められます。必ず強力なパスフレーズを入力し、安全な場所に書き留めます。

更に、CAの共通名(CN; Common Name)を確認するように求められます。CNは認証局のコンテキストでこのマシンを参照するために使用される名前です。任意の文字列を入力できますが、インターネット上で使う予定があれば自分の所有しているドメインにするのが良いでしょう。今回は例として`example.com`にします。

パスフレーズとCNを入力して成功すると、下記の2ファイルが生成されます。

- CAの公開鍵 `/home/cert/demoCA/pki/ca.crt`
- CAの秘密鍵 `/home/cert/demoCA/pki/private/ca.key`

秘密鍵は絶対に漏らしてはいけない物になります。

### 公開鍵の内容を確認

```console:マシン172.16.1.101:ユーザーcert
openssl x509 -text -in $HOME/$CA_NAME/pki/ca.crt | grep -E "Issuer:|Subject:"
openssl x509 -dates -noout -in $HOME/$CA_NAME/pki/ca.crt
```

こんな感じになります。

```console:マシン172.16.1.101:ユーザーcert
$ openssl x509 -text -in $HOME/$CA_NAME/pki/ca.crt | grep -E "Issuer:|Subject:"
        Issuer: CN = example.com
        Subject: CN = example.com
$ openssl x509 -dates -noout -in $HOME/$CA_NAME/pki/ca.crt
notBefore=Dec 29 07:26:07 2024 GMT
notAfter=Dec 29 07:26:07 2124 GMT
```

## オレオレ認証局が認証するサーバー証明書

### サーバー証明書を生成して認証

例えばサーバー`network.local`に対するサーバー証明書をパスフレーズ無しで生成する例は下記のようになります。

```console:マシン172.16.1.101:ユーザーcert
SRV_NAME=network.local

cd $HOME/$CA_NAME
./easyrsa build-server-full $SRV_NAME nopass
```

生成された各ファイルは、pkiディレクトリ内の各サブディレクトリに格納されます。

- 秘密鍵: `pki/private`
- 証明書要求: `pki/reqs`
- 証明書: `pki/issued`

### 公開鍵の確認

公開鍵の内容を確認します。

```console:マシン172.16.1.101:ユーザーcert
openssl x509 -text -in pki/issued/$SRV_NAME.crt -text | grep -E "Issuer:|Subject:"
openssl x509 -dates -noout -in pki/issued/$SRV_NAME.crt
```

下記のようになります。

```console:マシン172.16.1.101:ユーザーcert
$ openssl x509 -text -in pki/issued/$SRV_NAME.crt -text | grep -E "Issuer:|Subject:"
        Issuer: CN = example.com
        Subject: CN = network.local
$ openssl x509 -dates -noout -in pki/issued/$SRV_NAME.crt
notBefore=Dec 29 07:27:35 2024 GMT
notAfter=Dec 29 07:27:35 2124 GMT
```

## 仕舞い

ルート認証局、通称オレオレ認証局を作成しました。そしてそのオレオレ認証局が認証するサーバー証明書を作成しました。

利用するマシン全部にオレオレ認証局のインポートが必要なのでちょっと面倒ですが、自分だけの証明書を無料で設定する準備が出来ました。