SSL証明書ができるまで

# SSL証明書ができるまで

証明書を作成する流れは以下となります。
1. 秘密鍵の作成
2. CSR(Certificate Signing Request)の作成
3. CRTを作成(=証明書の作成)

まずはじめに種々の情報の暗号化、復号に使用するための秘密鍵を作成します。
続いて、証明書署名前要求を作成します。
これには先程作成した秘密鍵と対応する公開鍵や証明書を使用するユーザの所在地、会社名等の情報を含めます。
最後に、証明書署名前要求をもとに信頼できる証明機関によって署名されたデジタル証明書を作成します。
今回は自身で自身を証明する自己証明書を作成します。



### 1-1.秘密鍵の作成(パスワードなし)
RSA方式で秘密鍵を作成します。

```
[vagrant@localhost ~]$ openssl genrsa > server.key
Generating RSA private key, 2048 bit long modulus
................................................................+++
...........................+++
e is 65537 (0x10001)
```

### 1-2.秘密鍵の作成(パスワードあり)
RSA方式で秘密鍵を作成したあと、AESで秘密鍵を暗号化します。
パスワードがない秘密鍵が盗まれたら誰でも使えるのに対して、こちらはパスワードがわからなければ使えません。

```
[vagrant@localhost ~]$ openssl genrsa -aes128 > server.key
Generating RSA private key, 2048 bit long modulus
.....+++
.......+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
```

今回は検証ですのでパスワードなしの秘密鍵で進めます。

### Ex.公開鍵の作成
証明書の作成にこの手順は必要はありませんが、理解を深めるために作成します。

```
[vagrant@localhost ~]$ openssl rsa -pubout -in  server.key - out pub.key
writing RSA key
```
作成した鍵の詳細を見ていきましょう。

```
[vagrant@localhost ~]$ openssl rsa -text -pubin -noout -in  pub.key
Public-Key: (2048 bit)
Modulus:
    00:96:ae:3c:34:24:64:37:d7:1c:14:38:cd:3c:8e:
    50:c9:32:25:b6:9c:5b:e8:0f:b6:3f:37:01:de:38:
    32:b4:78:7a:dd:58:2b:89:b7:5a:d9:08:b8:d3:73:
    66:41:fd:5e:97:42:48:be:e9:35:da:d6:9c:17:4f:
    81:8a:25:34:ca:80:9a:24:62:fc:0e:f9:9d:3f:ce:
    51:99:5d:55:d2:3d:81:5f:17:c8:cb:25:54:bf:d1:
    fa:43:b0:82:8c:41:d7:e9:78:0f:2b:df:af:8b:ac:
    cb:0b:5f:6d:b7:58:1e:60:db:f9:c2:77:a0:0c:d1:
    33:e5:0a:68:30:5a:48:4a:d1:5c:38:90:43:9f:7a:
    e0:d8:dd:3d:5c:a6:5f:b6:f4:fa:25:64:ed:4e:13:
    14:75:6f:f7:b5:4b:b5:70:c4:b6:b1:38:ef:94:86:
    1a:15:0d:8c:29:e4:99:90:fe:42:86:a3:cb:df:0c:
    fb:97:ff:f2:e2:08:a2:bd:5b:c6:0c:33:b2:a3:bf:
    46:58:f1:71:9a:39:48:a3:d5:85:79:81:24:40:32:
    8b:bd:d9:5c:b5:d7:3e:6a:9f:5e:a2:2c:02:98:83:
    f4:1f:35:7b:f3:08:d9:1c:d0:59:2b:53:94:63:32:
    88:2e:29:49:43:43:6b:e6:a3:bf:0b:a4:ba:41:d6:
    a5:db
Exponent: 65537 (0x10001)
```

### 2.CSR(Certificate Signing Request)の作成
証明書を作成するのに必要となるCSRを作成します。


```
[vagrant@localhost ~]$ openssl req -new -key server.key -out server.csr
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.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:test
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```
作成したCSRの詳細を見ていきましょう。

```
[vagrant@localhost ~]$ openssl req -text -noout -in server.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, L=Default City, O=Default Company Ltd, CN=test
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:96:ae:3c:34:24:64:37:d7:1c:14:38:cd:3c:8e:
                    50:c9:32:25:b6:9c:5b:e8:0f:b6:3f:37:01:de:38:
                    32:b4:78:7a:dd:58:2b:89:b7:5a:d9:08:b8:d3:73:
                    66:41:fd:5e:97:42:48:be:e9:35:da:d6:9c:17:4f:
                    81:8a:25:34:ca:80:9a:24:62:fc:0e:f9:9d:3f:ce:
                    51:99:5d:55:d2:3d:81:5f:17:c8:cb:25:54:bf:d1:
                    fa:43:b0:82:8c:41:d7:e9:78:0f:2b:df:af:8b:ac:
                    cb:0b:5f:6d:b7:58:1e:60:db:f9:c2:77:a0:0c:d1:
                    33:e5:0a:68:30:5a:48:4a:d1:5c:38:90:43:9f:7a:
                    e0:d8:dd:3d:5c:a6:5f:b6:f4:fa:25:64:ed:4e:13:
                    14:75:6f:f7:b5:4b:b5:70:c4:b6:b1:38:ef:94:86:
                    1a:15:0d:8c:29:e4:99:90:fe:42:86:a3:cb:df:0c:
                    fb:97:ff:f2:e2:08:a2:bd:5b:c6:0c:33:b2:a3:bf:
                    46:58:f1:71:9a:39:48:a3:d5:85:79:81:24:40:32:
                    8b:bd:d9:5c:b5:d7:3e:6a:9f:5e:a2:2c:02:98:83:
                    f4:1f:35:7b:f3:08:d9:1c:d0:59:2b:53:94:63:32:
                    88:2e:29:49:43:43:6b:e6:a3:bf:0b:a4:ba:41:d6:
                    a5:db
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         5d:74:a3:f1:f6:a0:63:29:82:2e:56:dc:3e:6a:12:e5:64:99:
         d0:b8:5a:96:35:75:88:16:c0:7b:c0:07:ed:15:70:c0:ae:e8:
         12:37:a3:88:be:66:07:a4:cd:d6:ad:6f:d1:e8:06:79:6d:15:
         e0:27:09:cd:74:66:33:ea:88:d4:78:79:a7:f7:52:1a:19:a1:
         55:92:cc:73:c1:7e:1b:81:0e:04:21:43:cd:c4:14:1b:f0:8f:
         07:1c:12:6c:f5:14:d2:75:e9:02:98:76:44:c8:18:45:58:6e:
         40:79:74:7e:62:c4:fd:6a:33:ac:23:8c:d2:b6:78:70:0c:9b:
         8a:14:04:b2:70:f9:4a:11:d0:32:dc:fa:bd:d6:cd:b9:77:1a:
         ca:23:86:61:1f:c5:58:89:11:e0:cf:93:0c:1f:4c:7f:9a:91:
         40:c9:a4:26:2e:da:09:18:03:61:f5:48:9d:7b:5f:02:fc:d4:
         1f:83:eb:55:ed:9b:4f:6b:1d:03:ea:6d:96:9e:3d:04:e8:9d:
         68:8b:03:d4:e8:4e:45:f2:b4:6a:47:fa:24:cc:4d:cb:1b:da:
         9d:85:77:00:5a:ca:41:59:92:46:88:d9:fc:c7:3f:ad:ca:b2:
         d6:d8:bf:1f:17:0e:86:57:7a:bf:7a:7c:a7:39:6c:97:ec:cf:
         79:0a:4a:a5
```

module以下に注目してください。先ほど作成した公開鍵が含まれていることがわかります。
また「Signature Algorithm: sha256WithRSAEncryption」となっていますね。
これはsha256でハッシュ値を求めた後に、秘密鍵で暗号化するということです。

つまり署名するとは、
バージョン、シリアル番号、サブジェクト、公開鍵等の情報(=署名前証明書)をハッシュ化し、それを暗号化するということなのです。

認証局は次の２つを確認することによって検証します。
1. 添付された署名から公開鍵で復号することによって得られたハッシュ値
2. 署名前証明書からSignature Algorithmに記載のハッシュ関数によって求めたハッシュ値

一致すれば証明書は改ざんされていない、証明書の作成者はその添付された公開鍵の対となる秘密鍵を持つサーバ自身であるとわかります。

検証についは以下がわかりやすいですね。
![Digital_Signature_diagram](https://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/Digital_Signature_diagram.svg/800px-Digital_Signature_diagram.svg.png)
[Image from the Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Digital_Signature_diagram.svg)

### 3.CRTの作成
先ほど作成したcsrをもとに自身の秘密鍵で署名します。
これがいわゆる自己証明書となります。
本来であればここは信頼できる第三者の証明機関によって署名することになります。

```
[vagrant@localhost ~]$ openssl x509 -text -noout -in server.crt
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            88:22:73:89:fb:e0:af:70
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, L=Default City, O=Default Company Ltd, CN=test
        Validity
            Not Before: Jul 19 15:20:27 2019 GMT
            Not After : Nov 19 15:20:27 3018 GMT
        Subject: C=JP, L=Default City, O=Default Company Ltd, CN=test
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:96:ae:3c:34:24:64:37:d7:1c:14:38:cd:3c:8e:
                    50:c9:32:25:b6:9c:5b:e8:0f:b6:3f:37:01:de:38:
                    32:b4:78:7a:dd:58:2b:89:b7:5a:d9:08:b8:d3:73:
                    66:41:fd:5e:97:42:48:be:e9:35:da:d6:9c:17:4f:
                    81:8a:25:34:ca:80:9a:24:62:fc:0e:f9:9d:3f:ce:
                    51:99:5d:55:d2:3d:81:5f:17:c8:cb:25:54:bf:d1:
                    fa:43:b0:82:8c:41:d7:e9:78:0f:2b:df:af:8b:ac:
                    cb:0b:5f:6d:b7:58:1e:60:db:f9:c2:77:a0:0c:d1:
                    33:e5:0a:68:30:5a:48:4a:d1:5c:38:90:43:9f:7a:
                    e0:d8:dd:3d:5c:a6:5f:b6:f4:fa:25:64:ed:4e:13:
                    14:75:6f:f7:b5:4b:b5:70:c4:b6:b1:38:ef:94:86:
                    1a:15:0d:8c:29:e4:99:90:fe:42:86:a3:cb:df:0c:
                    fb:97:ff:f2:e2:08:a2:bd:5b:c6:0c:33:b2:a3:bf:
                    46:58:f1:71:9a:39:48:a3:d5:85:79:81:24:40:32:
                    8b:bd:d9:5c:b5:d7:3e:6a:9f:5e:a2:2c:02:98:83:
                    f4:1f:35:7b:f3:08:d9:1c:d0:59:2b:53:94:63:32:
                    88:2e:29:49:43:43:6b:e6:a3:bf:0b:a4:ba:41:d6:
                    a5:db
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         44:8a:b4:8e:14:43:5a:3c:2a:d8:50:91:c9:2b:30:61:5b:a0:
         6a:20:29:5b:59:55:f9:41:0d:97:80:64:4e:d9:76:de:3a:e0:
         31:b1:73:92:89:5f:c7:8f:ab:84:42:66:9e:3c:80:97:48:b6:
         41:62:2e:56:b5:21:c4:ad:04:0d:cf:d6:f5:88:2a:b5:64:b0:
         a7:c3:95:4f:5d:e2:c5:b5:f3:fa:74:41:01:04:7d:1c:70:2f:
         7f:3e:6a:e4:bd:9e:df:43:84:21:3f:52:1b:e7:76:13:3c:32:
         e5:e6:cb:3d:cd:f1:5a:af:3a:2c:c5:1b:1b:9d:95:55:76:17:
         5d:79:34:f9:9d:3f:90:3a:27:5e:85:5f:da:10:54:ef:96:a0:
         d9:de:cb:01:84:e6:76:6a:8b:9f:40:53:9f:70:5f:2d:b2:fb:
         3d:5d:bf:c5:cd:ec:01:46:e7:46:23:b6:ae:3c:fd:72:f2:a1:
         47:4c:e1:14:05:50:98:0f:0f:17:65:5b:4f:34:5c:fb:e0:74:
         70:70:f4:1f:63:39:7b:32:39:b2:57:19:b0:b5:dd:41:f2:14:
         f5:74:39:3f:57:25:ed:91:0b:4b:9d:e7:6b:a8:9f:3e:18:c0:
         68:21:c5:60:16:95:3e:54:d5:36:5d:af:ca:34:ba:87:5f:c3:
         df:18:7a:37
```

これで完成です。


## 参考文献
https://knowledge.digicert.com/solution/SO6411.html