easy-ca によるオレオレ認証局とオレオレ証明書

自分のための作業メモ。サーバは CentOS 8 (Alma Linux 8.4) で openssl はインストール済み。

[**"オレオレ認証局とオレオレ証明書（旧版）"**](https://qiita.com/softark/items/15a5280bd38c5dd97b48) で使っていた `CA` スクリプトが `openssl` のパッケージから削除されたので、別の方法による。

# 1) 準備作業

## 1-1) `easy-ca`

`softark/easy-ca` (https://github.com/softark/easy-ca) を `github` からクローンして取得する。

```bash:
[user@centos ~]$ git clone https://github.com/softark/easy-ca.git
```

大元の `redredgroovy/easy-ca` は放棄された状態である。いろいろなフォークを調べた人によると、`tomberek` のものが良い（[**"Project is abandoned, but I like it"**](https://github.com/redredgroovy/easy-ca/issues/5)）という話であった。

ここでは、`tomberek` からフォークして更に手を加えた私自身のフォークを使う。

## 1-2) `$HOME/easy-ca/defaults.conf` を修正

毎回尋ねられる情報のデフォルト値を与えておく。

```configuration:defaults.conf
CA_DOMAIN="softark.net"

CA_CERT_C="JP"
CA_CERT_ST="Hyogo Pref."
CA_CERT_L="Taka Town"
CA_CERT_O="Softark"
CA_CERT_OU="Development"
```

## 1-3) `$HOME/easy-ca/templates/*.tpl` を修正

デフォルトの有効期限日数 `default_days` を適当に延ばす。
`root.tpl` には 2ヶ所あるので注意。

# 2) 認証局証明書

自分で勝手に認証局証明書を作成して、サーバをオレオレ認証局に仕立て上げる。

## 2-1) 認証局証明書の生成

`create-root-ca -d [ca-name]` で認証局証明書を作成する。`-d` オプションは認証局の略称を指定するものである。

```shell:
[user@centos ~]$ cd easy-ca
[user@centos easy-ca]$ ./create-root-ca -d softark-ca
```

スクリプトが入力を求めてくるが、`defaults.conf` でデフォルト値を与えたものはそのままエンター・キーで承認すれば良い。証明書のパス・フレーズだけは適当なものを入力し、それを記憶（記録）する必要がある。

スクリプトは `easy-ca` ディレクトリの下に `[ca-name]` サブ・ディレクトリを作り、生成した認証局証明書を格納する。

それと同時に、各種スクリプトと設定ファイルやテンプレートがこのサブ・ディレクトリの中にコピーされる。今後、この認証局を使って証明書を発行する作業は、すべてこのサブ・ディレクトリの中で行うことになる。

## 2-2) 認証局証明書のファイル

- 認証局証明書 : $HOME/easy-ca/[ca-name]/ca/ca.crt
- 認証局秘密鍵 : $HOME/easy-ca/[ca-name]/ca/private/ca.key

認証局証明書をファイル名を変えて標準の場所にコピーする。

```shell:
[user@centos easy-ca]$ cd softark-ca
[user@centos softark-ca]$ sudo cp softark-ca/ca/ca.crt /etc/pki/tls/certs/softark-ca.crt
```

## 2-3) クライアントへのインストール

サーバから認証局証明書 softark-ca.crt をダウンロードし、「証明書マネージャ」`certmgr` を使ってインストールする。

`certmgr` は、`IE > インターネット・オプション > コンテンツ > 証明書` または `ファイル名を指定して実行 > certmgr.msc` で起動する。

「信頼されたルート証明機関」に softark-ca.crt をインポートする。

## 2-4) グループポリシーの「信頼されたルート証明機関」として登録する

社内ネットワークなど Active Directory のドメインにおいては、個々の PC に認証局証明書をインストールするのではなく、ドメイン・コントローラで、グループポリシーの「信頼されたルート証明機関」として認証局証明書を登録するのが良い。この方が圧倒的に便利である。

グループポリシー・エディタで `Default Domain Policy > コンピュータの構成 > ポリシー > Windowsの設定 > セキュリティの設定 > 公開キーのポリシー > 信頼されたルート証明機関` に認証局証明書をインポートする。

**["Windows Serverを認証局にしよう" > "グループポリシーに証明書をインポート"](https://ascii.jp/elem/000/000/533/533755/index-2.html)** を参照。


# 3) サーバ証明書

オレオレ認証局で、サーバ証明書を生成して発行する。

## 3-1) サーバ証明書の生成

`easy-ca/[ca-name]` のディレクトリに入って `bin/create-server -s [sv-name] -a domain.name -a alt1.domain.name -a alt2.domain.name ...` を実行する。

`-s` オプションでサーバの説明的な名称を指定する。これを安全な文字列に変換したものが証明書のファイル名として使われる。

`softark.net`, `www.softark.net`, `mng.softark.net` など、エイリアスも含めて使用しうる全ての FQDN を `-a` オプションで列挙する。

```shell:
[user@centos ~]$ cd easy-ca/softark-ca
[user@centos softark-ca] ./bin/create-server -s "softark" \
    -a softark.net -a www.softark.net -a mng.softark.net
```

## 3-2) サーバ証明書のファイル

以下のファイルが作成される。

- サーバ証明書 : $HOME/easy-ca/[ca-name]/certs/server/[sv-name]/[sv-name].crt
- サーバ証明書鍵 : $HOME/easy-ca/[ca-name]/certs/server/[sv-name]/[sv-name].key


# 4) サーバ証明書の利用

## 4-1) 証明書の設置

サーバ証明書とその鍵を標準の場所に置く。

```shell:
[user@web somewhere]$ sudo mv softark.crt /etc/pki/tls/certs/.
[user@web somewhere]$ sudo mv softark.key /etc/pki/tls/certs/.
```

後述するクライアント認証もしたい場合は、認証局証明書も同じ場所に置く。

```shell:
[user@web somewhere]$ sudo mv softark-ca.crt /etc/pki/tls/certs/.
```

## 4-2) NGINX の設定

Let's Encrypt が使えないイントラ・ネット内のウェブ・サーバを SSL 化する場合に、ここで作ったサーバ証明書を使うことが出来る。

```configuration:ssl.conf
server {
    listen 443 ssl http2;
    ...
    ssl_certificate /etc/pki/tls/certs/softark.crt;
    ssl_certificate_key /etc/pki/tls/certs/softark.key;
}
```

Apache の場合については、 [**"オレオレ認証局とオレオレ証明書（旧版）"**](https://qiita.com/softark/items/15a5280bd38c5dd97b48) を参照。

# 5) クライアント証明書

オレオレ認証局で、クライアント証明書を生成して発行する。

## 5-1) クライアント証明書の生成

`easy-ca/[ca-name]` のディレクトリに入って `./bin/create-client -c [cl-name]` で、クライアント証明書を作成する。

`-c` オプションではクライアントの説明的な名称を指定する。メール・アドレスでも構わない。

```shell:
[user@centos ~]$ cd easy-ca/softark-ca
[user@centos softark-ca]$ ./bin/create-client -c kihara
```

## 5-2) クライアント証明書のファイル

以下のファイルが作成される。

- p12 クライアント証明書 : $HOME/easy-ca/[ca-name]/certs/clients/[cl-name]/[cl-name].p12

他にもファイルが生成されるが、最終的に必要なのは PKCS#12 形式の `.p12` ファイルだけである。

## 5-3) クライアントへのインストール

サーバからクライアント証明書 kihara.p12 をダウンロードし、「証明書マネージャ」`certmgr` を使ってインストールする。

`certmgr` は、`IE > インターネット・オプション > コンテンツ > 証明書` または `ファイル名を指定して実行 > certmgr.msc` で起動する。

「個人」フォルダを右クリック > 全てのタスク > インポートで、「証明書のインポート ウィザード」が起ち上がるので、kihara.p12 を選択して「個人」にインポートする。

`certmgr` を起動せず、kihara.p12 をダブル・クリック（または右リック・メニューから「PFX のインストール」を選択）しても構わない。上記と同様に「証明書のインポート ウィザード」が起ち上がる。ただし、この場合は「保存場所」として「ローカル コンピュータ－」が選択可能になるので要注意である。「ローカル コンピューター」を選ぶとインストールに失敗する。一見、成功裏にインストールが完了するのだが、後で `certmgr` で見ると、実際にはインストール出来ていない。「現在のユーザー」を選ぶこと。

# 6) クライアント証明書の利用

## 6-1) NGINX でのアクセス制限

ウェブ・サイトへのアクセスに、認証されたクライアントからの SSL 接続を要求する。

```configuration:ssl.conf
server {
    listen 443 ssl http2;
    ...
    ssl_verify_client on;
    ssl_client_certificate /etc/pki/tls/certs/softark-ca.crt;
}
```
最後の2行を 「4-2) NGINX の設定」で述べた設定ファイルに追記する。クライアント証明があること、および、それが特定の認証局で発行されたものであることを要求する訳である。

クライアント証明書の内容までチェックすることも可能だが、通常はそこまでする必要は無いだろう。

なお、SSL のその他の設定は Let's Encrypt に任せても良い。つまり、`ssl_certificate` および `ssl_certificate_key` には、Let's Encrypt によって取得したものをそのまま使用しても良い。

Apache の場合については、 [**"オレオレ認証局とオレオレ証明書（旧版）"**](https://qiita.com/softark/items/15a5280bd38c5dd97b48) を参照。

# 7) コード署名用デジタル証明書

オレオレ認証局で、コード署名用のデジタル証明書を生成して発行する。

## 7-1) コード署名用デジタル証明書の生成

`easy-ca/[ca-name]` のディレクトリに入って `./bin/create-codesign -c [cs-name]` で、コード署名用のデジタル証明書を作成する。

`-c` オプションで証明書の説明的な名称を指定する。

```shell:
[user@centos ~]$ cd easy-ca/softark-ca
[user@centos softark-ca]$ ./bin/create-codesign -c ark-code
```

## 7-2) コード署名用デジタル証明書のファイル

以下のファイルが作成される。

- p12 コード署名用デジタル証明書 : $HOME/easy-ca/[ca-name]/certs/codesign/[cs-name]/[cs-name].p12

他にもファイルが生成されるが、最終的に必要なのは PKCS#12 形式の `.p12` ファイルだけである。

## 7-3) パソコンへのインストール

サーバからコード署名用デジタル証明書 ark-code.p12 をダウンロードし、「証明書マネージャ」`certmgr` を使ってインストールする。

`certmgr` は、`IE > インターネット・オプション > コンテンツ > 証明書` または `ファイル名を指定して実行 > certmgr.msc` で起動する。

インポート・オプションで**「このキーをエクスポート可能にする」**にチェックを入れて、「個人」に ark-code.p12 をインポートする。

# 8) コード署名用デジタル証明書の利用

これで Excel 等のマクロ (VBA) にデジタル署名を追加することが出来るようになる。

Active Directory 環境で認証局証明書が「信頼されたルート証明機関」に登録されている場合は、このコード署名が Active Directory に属するパソコン全てで通用する。

マクロは使いたいが、セキュリティの閾をむやみに下げたくない、という場合に効果的である。