中間CA向けキーマテリアルを作成する

# 中間CA向けキーマテリアル作成

[プライベートCAを構築](https://qiita.com/sipadan2003/items/4f2ab95cb2019ae8bb79)したら，今度は各サーバ向けに証明書を発行できるようになります。

ここでは，中間CA向けのキーマテリアル（秘密鍵や証明書などデジタル証明関連のファイル）を作成する方法を紹介します。

なお，OpenSSLのコマンドの詳細は，「[openssl 1.0.2 manpages](https://www.openssl.org/docs/man1.0.2/apps/openssl.html)」にあります。

## 確認環境

1つのマシンですべての作業を行うことは可能ですが，本来は秘密鍵ファイルとCSRファイルを作成する側と，証明書ファイルを発行する側は，異なる組織または部門で行うものです。

ここでは異なる組織／部門で行うことを想定して，2つのマシンで作業します。

- 中間CAのマシン
  - このマシンで，秘密鍵ファイル，CSRファイルを作成
  - CentOS 7
  - OpenSSL 1.0.2k-fips
- プライベートCAのマシン
  - プライベートCAの構築方法は「[プライベートCAを構築する](https://qiita.com/sipadan2003/items/4f2ab95cb2019ae8bb79)」を参照
  - このマシンが「 **ルートCA** 」の位置付けとなる

## 中間CAマシンでの作業

### 作業ディレクトリを作成

作業ディレクトリを作成し，そこに移動します。

```bash
$ mkdir -p /tmp/keys
$ cd /tmp/keys
```

### 利用可能な曲線を確認

次のコマンドで， ```prime256v1``` が出力されればOKです。

```bash
$ openssl ecparam  -list_curves
```

### 秘密鍵ファイルを作成

曲線 ```prime256v1``` を使用して，暗号鍵ファイル ```private.pem``` を作成します。


```bash
$ openssl ecparam -name prime256v1 -genkey -out private.pem
```

### 秘密鍵が破損していないことを確認

```bash
$ openssl ecparam -check -noout -in private.pem
```

### 秘密鍵ファイルをPKCS#8に変換

```bash
$ openssl pkcs8 -topk8  -nocrypt -in private.pem -out key.pem
```

### CSRファイルを作成

```bash
$ openssl req -new -sha256 -key key.pem -out csr.pem -verbose -subj "/C=JP/ST=Tokyo/L=Minato-ku/O=My Company/OU=My Company Certificate Authority/CN=*.example.com"
```

### CSRファイルを確認

```bash
$ openssl req -text -noout -in csr.pem
```

以上で，秘密鍵ファイルとCSRファイルを作成できました。秘密鍵は漏洩しないように管理します。
CSRファイル ```csr.pem``` 「だけ」をプライベートCAに渡して，証明書を発行してもらうことになります。


## プライベートCAマシンでの作業

今度は，プライベートCA（ルートCAの位置付け）で，中間CAから受け取ったCSRファイル ```csr.pem``` から証明書ファイル ```cert.pem``` を作成します。

### 作業ディレクトリを作成

作業ディレクトリを作成し，そこに移動します。

```bash
$ mkdir -p /tmp/keys
$ cd /tmp/keys
```

### 証明書の拡張情報ファイルを作成

プライベートCAで証明書を作成する際に，証明書に追記する情報が必要です。
サーバの種類ごとに情報が異なるため，その都度ファイルを作成します。
中間CA向けの証明書の場合，次のような内容になります。Webサーバ向けの場合は内容が異なるので留意します。
```keyUsage``` がポイントで，中間CAとしては ```cRLSign``` と ```keyCertSign``` が必要です。

```:v3.txt
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:TRUE
keyUsage = critical, cRLSign, keyCertSign
subjectKeyIdentifier=hash
```

### 証明書ファイルを作成

有効期限が1,068日(3年間)の証明書ファイルを作成します。

```/etc/pki/tls/openssl.cnf``` ファイルを見ての通り，OpenSSLはデフォルトでは ```policy_match``` のポリシーで証明書を作成します。しかし，このポリシーだとプライベートCAとCSRファイルの国名，都市名，組織名が一致しないと証明書を作成できません。そのため， ```-policy policy_anything``` オプションを指定して緩い条件で証明書を作成します。

また， ```-extfile v3.txt``` オプションで拡張情報ファイルを指定します。先述の通り，証明書に「中間CA向けの証明書」であることを書き込むためです。

```bash
$ sudo openssl ca -policy policy_anything -days 1068 -in csr.pem -out cert.pem -extfile v3.txt
```

なお，過去に作成した証明ファイルと同じ国名，組織名などで証明書を作成しようとした場合に，次のエラーが出力されます。

```
failed to update database
TXT_DB error number 2
```

このようなときは，次の方法で過去の証明書を取り消させます。
```xxx.pem``` は過去に発行した証明書ファイルです。

```bash
$ sudo openssl ca -revoke /etc/pki/CA/newcerts/xxx.pem
```

### 証明書ファイルを確認

最後に，証明書ファイルを確認します。

```
$ openssl x509 -text -noout -in cert.pem
$ cat cert.pem
```

以上で作成した証明書ファイル ```cert.pem``` を，中間CAのマシンに渡します。
これで「証明書を発行」したことになります。

## 中間CAマシンで必要なファイル

以上の作業でいくつかファイルが揃いますが，中間CAで必要なのは次のファイルのみです。
それ以外は破棄します。特に，```key.pem``` は漏洩しないように管理します。

- ```key.pem``` : 秘密鍵ファイル
- ```cert.pem``` : 証明書ファイル

## プライベートCAの管理状況

余談ですが，プライベートCAで証明書を発行した時に生成されるファイルについては，次のコマンドを実行すれば分かります。treeコマンドがない場合は， ```sudo yum install tree``` で投入します。

```bash
$ sudo su -c "tree /etc/pki/"
```