オレオレ証明書発行

# やりたいこと

  * 自宅用WEBサービスをアクセス制限（クライアント証明書による認証）したい。
  * 今更ですが・・・
 
# やりたいこと(詳細)

  * オレオレ認証局から、WEBサーバ証明書／クライアント証明書を発行します。
  * 証明書の発行は、Ansibleを使用します（コマンドを叩きたくない）

# 制限事項

  * apacheの設定は当記事対象外とします。
  * 失効処理とCRL発行処理は手動(easy-rsaコマンド)とします。

# 環境/ツール

  * CentOS8環境(yumコマンド使ってます)
  * OPENVPN関連のツールのひとつである、easy-rsaを使用します。
    * 選定の理由は、CAキーペア生成が簡単にできるため。
    * https://github.com/OpenVPN/easy-rsa/blob/master/README.md

# 手順

## 手順1.easy-rsaのインストール

  * EPELにeasy-rsaがあるので、YUMインストール

```
# yum install epel-release
# yum install easy-rsa
```

  * 認証局用専用ユーザの作成(certadmin)

```
# useradd certadmin
```

  * easy-rsa用フォルダの作成、必要ファイルのリンク作成

```
# su - certadmin
$ mkdir easy-rsa
$ chmod 700 easy-rsa
$ ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
```

## 手順2.easy-rsaでオレオレ認証局構築

  * 認証局の初期化(情報を格納するdirectory(pki/)を作成(初期化)します。

```
$ cd easy-rsa
$ ./easyrsa init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/certadmin/easy-rsa/pki
```

  * 認証局のを作成(パスワードなし、CN＝MyHomeCA)します。

```
$ ./easyrsa build-ca nopass
Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
Generating RSA private key, 2048 bit long modulus (2 primes)
....................+++++
.................+++++
e is 65537 (0x010001)
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]:MyHomeCA

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/certadmin/easy-rsa/pki/ca.crt

$ 
```

  * 空のCRLのファイルを生成(Apacheでクライアント認証時、CRL証明書情報が必要であるため作成)

```
$ ./easyrsa gen-crl
Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
Using configuration from /home/certadmin/easy-rsa/pki/easy-rsa-27657.yrhss7/tmp.dB4v6v

An updated CRL has been created.
CRL file: /home/certadmin/easy-rsa/pki/crl.pem


$ 
```

## 手順3.認証局の証明書内容確認

```
$ ls -l pki/ca.crt       ....CA公開鍵
-rw------- 1 certadmin certadmin 1192  5月 21 17:43 pki/ca.crt
$ ls -l pki/private/ca.key    ....CA秘密鍵
-rw------- 1 certadmin certadmin 1679  5月 21 17:43 pki/private/ca.key
$ ls -l pki/crl.pem        ....CRL情報
-rw------- 1 certadmin certadmin 642  5月 21 17:47 pki/crl.pem

$ openssl x509 -in pki/ca.crt -noout -subject -issuer -dates
subject=CN = MyHomeCA              ....CA公開鍵の情報確認(CNと期間は10年間で生成されていることを確認)
issuer=CN = MyHomeCA
notBefore=May 21 08:43:42 2020 GMT
notAfter=May 19 08:43:42 2030 GMT
[certadmin@myhome easy-rsa]$ 
```

## 手順4.githubからAnsible-playbook取得

```
git clone https://github.com/mishikawan/generatecert-ansible.git
```

### 手順4-1.サーバ証明書の発行内容を変更

* 発行したいサーバ証明書情報を記載
* 以下のようなサーバ証明書を作成したい場合は、server-certs.csvに以下を記述します
* CSVの一行目はカラム情報のため変更はしないでください。

| name | country | state | locality | organization | organizational_unit |
| ---  | ---  | ---  | ---  | ---  | ---  |
| myhome.local | JP | Osaka | Osaka | MyHome | MyHome |

```server-certs.csv
name,country,state,locality,organization,organizational_unit
myhome.local,JP,Osaka,Osaka,MyHome,MyHome
```

### 手順4-2.クライアント証明書の発行内容を変更

* 発行したいクライアント証明書情報を記載
* 以下のようなクライアント証明書を作成したい場合は、client-certs.csvに以下を記述します
* CSVの一行目はカラム情報のため変更はしないでください。

| name | メール | パスワード | organizational_unit |
| ---  | ---  | ---  | ---  |
| user001 | user001@myhome.local | pass001 | Development |
| user002 | user002@myhome.local | pass002 | Production |
| user003 | user003@myhome.local | pass003 | Sales |


```client-certs.csv
name,mailaddr,pass,organizational_unit
user001,user001@myhome.local,pass001,Development
user002,user002@myhome.local,pass002,Production
user003,user003@myhome.local,pass003,Sales
```
### 手順5.証明書の発行(ansible)の実行

```
ansible-playbook generate_certs.yml
```
### 手順6.証明書発効の確認

* ansible(generate_certs.yml)のvarsに従いファイルが作成されます。 

```generate_certs.yml
  vars:
    ca_private: "~/easy-rsa/pki/private/ca.key"
    ca_public: "~/easy-rsa/pki/ca.crt"
    publicdir: "~/easy-rsa/pki/issued"
    csrdir: "~/easy-rsa/pki/reqs"
    privatedir: "~/easy-rsa/pki/private"
    pkcs12dir: "~/easy-rsa/pki/private"
    server_csv: "server-certs.csv"
    client_csv: "client-certs.csv"
```

* CSRファイル

```
$ ls -l ~/easy-rsa/pki/reqs/
-rw-rw-r-- 1 certadmin certadmin 1119  6月 26 22:31 myhome.local.csr
-rw-rw-r-- 1 certadmin certadmin 1013  6月 26 22:32 user001.csr
-rw-rw-r-- 1 certadmin certadmin 1013  6月 26 22:32 user002.csr
-rw-rw-r-- 1 certadmin certadmin 1005  6月 26 22:32 user003.csr
```

* 秘密鍵とPKCS12ファイル

```
$ ls -l ~/easy-rsa/pki/private/
-rw------- 1 certadmin certadmin 1675  5月 21 09:52 ca.key
-rw------- 1 certadmin certadmin 1679  6月 26 22:31 myhome.local.key
-rw------- 1 certadmin certadmin 1679  6月 26 22:32 user001.key
-r-------- 1 certadmin certadmin 3376  6月 26 22:32 user001.p12
-rw------- 1 certadmin certadmin 1675  6月 26 22:32 user002.key
-r-------- 1 certadmin certadmin 3376  6月 26 22:32 user002.p12
-rw------- 1 certadmin certadmin 1675  6月 26 22:32 user003.key
-r-------- 1 certadmin certadmin 3376  6月 26 22:35 user003.p12
```

* 公開鍵ファイル

```
$ ls -l ~/easy-rsa/pki/issued/
-rw-rw-r-- 1 certadmin certadmin 1298  6月 26 22:31 myhome.local.crt
-rw-rw-r-- 1 certadmin certadmin 1188  6月 26 22:32 user001.crt
-rw-rw-r-- 1 certadmin certadmin 1188  6月 26 22:32 user002.crt
-rw-rw-r-- 1 certadmin certadmin 1180  6月 26 22:35 user003.crt
```