ssl証明書まとめ

簡単なところからちょっと応用的なところまでまとめる。

#sslとは?
secure socket layerの略。
インターネット上で通信を暗号化する技術。

# 何を暗号化するのか？
passwordや暗証番号など。

# どのような技術を用いているか。
* 公開鍵暗号
* 共通鍵暗号
* ハッシュ

# 証明書作成
## 証明書発行の手順
1. サーバ管理者が秘密鍵ファイルを(server.key)を作成。
2. サーバ管理者が秘密鍵ファイルから、公開鍵(public key)と電子署名を組み合わせて、証明書要求ファイルを作成する。サーバ管理者はこの証明書要求ファイルを認証局に送付する。
3. 認証局は自分の秘密鍵で、証明書要求ファイルに署名し、サーバ証明書(server.crt)を作成し、返却する。

![image](https://qiita-image-store.s3.amazonaws.com/0/122149/b9c066b5-9ef9-ba05-43aa-38f3216c948d.png)



## CSRとは
certificate signing requestまたはcertification requestの略。
内容は以下のものからなる。
* 公開鍵
* 申請者の署名
* 識別名

識別名とは
common name 
organization
など証明書要求を作る際に入力する項目のこと。

実際に確認してみる。確認の際にはまずcat等のコマンドで
作成したCSRの内容をコピーし,下記のように

```
$openssl req -text -noout
```
と打った後にコピーしたCSRの内容をペーストすると見れる。


```
$ openssl req  -text -noout
-----BEGIN CERTIFICATE REQUEST-----
MIICtjCCAZ4CAQAwcTELMAkGA1UEBhMCSlAxDjAMBgNVBAgTBVRva3lvMRIwEAYD
VQQHEwlNaW5hdG8ta3UxFjAUBgNVBAoTDVNTTCBUZXN0IENvcnAxFDASBgNVBAsT
C3Rlc3QtMjAxNjA1MRAwDgYDVQQDEwd0ZXN0LmpwMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEA0FKYiv6u5sSAMln/y7PStD094/om343VPcwQJEHAnqg3
UKPbwZXJYpd8D6TJk7dLA3Wv3XHuTvN8SGJZu+L2jK7jcwpy9wm1iSwnkzWzlZus
jV97rMxWTmdarAC4M4B/WEAmn2I8+b+h1TL8Si14Q5JY/YLIsgXXGoQKFUL1Egx3
5Qex8NPJ3OkkM5ISIJrJU+BMg/0tNLEe5wLIP1aLxBsmezaGTi3OnJvfC2vfDeej
07yjtAYiHjD1jkWFCjNtWAblxNlTFMGPT5FfFolpRhBXM/7gKgGyUQxB/w+0xZFp
/oKNShd8xsnu6RWFZ2f7iLtN4BlOQMQqT/f5zTIdlwIDAQABoAAwDQYJKoZIhvcN
AQEFBQADggEBAI2wOElmUhebghfw9wXcqXiQekjk/FEfNBO7N8e+AAxOfQRkkyXB
pzqVSAbK9MxbGW3tuB2wC8var1/G6a2RntIEypXDz+cR2+sWxoH3OfQ9bT8f/5xL
TCJ5azM1O/zu3P+gbM3iytZi8D/Vw7UlpyhHMplUaueaYxvMdhrBu+InrBBv3IvJ
M4spFzZrEzGqpUrQ+2WMHGr6867+Td0J2qkpZFIkGoOdsVg/igqD6hkiOsh5PjBW
SufIOsqol5pCynbESWdvM9mLLI/3tNpig0dZMwGKEIRnZDwIjl9kCqDqvGORHOWp
X9cwvVtTZNUQAZHjCiYt/Tjlp9ovUJMaCMs=
-----END CERTIFICATE REQU
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=Tokyo, L=Minato-ku, O=SSL Test Corp, OU=test-201605, CN=test.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:d0:52:98:8a:fe:ae:e6:c4:80:32:59:ff:cb:b3:
                    d2:b4:3d:3d:e3:fa:26:df:8d:d5:3d:cc:10:24:41:
                    c0:9e:a8:37:50:a3:db:c1:95:c9:62:97:7c:0f:a4:
                    c9:93:b7:4b:03:75:af:dd:71:ee:4e:f3:7c:48:62:
                    59:bb:e2:f6:8c:ae:e3:73:0a:72:f7:09:b5:89:2c:
                    27:93:35:b3:95:9b:ac:8d:5f:7b:ac:cc:56:4e:67:
                    5a:ac:00:b8:33:80:7f:58:40:26:9f:62:3c:f9:bf:
                    a1:d5:32:fc:4a:2d:78:43:92:58:fd:82:c8:b2:05:
                    d7:1a:84:0a:15:42:f5:12:0c:77:e5:07:b1:f0:d3:
                    c9:dc:e9:24:33:92:12:20:9a:c9:53:e0:4c:83:fd:
                    2d:34:b1:1e:e7:02:c8:3f:56:8b:c4:1b:26:7b:36:
                    86:4e:2d:ce:9c:9b:df:0b:6b:df:0d:e7:a3:d3:bc:
                    a3:b4:06:22:1e:30:f5:8e:45:85:0a:33:6d:58:06:
                    e5:c4:d9:53:14:c1:8f:4f:91:5f:16:89:69:46:10:
                    57:33:fe:e0:2a:01:b2:51:0c:41:ff:0f:b4:c5:91:
                    69:fe:82:8d:4a:17:7c:c6:c9:ee:e9:15:85:67:67:
                    fb:88:bb:4d:e0:19:4e:40:c4:2a:4f:f7:f9:cd:32:
                    1d:97
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha1WithRSAEncryption
        8d:b0:38:49:66:52:17:9b:82:17:f0:f7:05:dc:a9:78:90:7a:
        48:e4:fc:51:1f:34:13:bb:37:c7:be:00:0c:4e:7d:04:64:93:
        25:c1:a7:3a:95:48:06:ca:f4:cc:5b:19:6d:ed:b8:1d:b0:0b:
        cb:da:af:5f:c6:e9:ad:91:9e:d2:04:ca:95:c3:cf:e7:11:db:
        eb:16:c6:81:f7:39:f4:3d:6d:3f:1f:ff:9c:4b:4c:22:79:6b:
        33:35:3b:fc:ee:dc:ff:a0:6c:cd:e2:ca:d6:62:f0:3f:d5:c3:
        b5:25:a7:28:47:32:99:54:6a:e7:9a:63:1b:cc:76:1a:c1:bb:
        e2:27:ac:10:6f:dc:8b:c9:33:8b:29:17:36:6b:13:31:aa:a5:
        4a:d0:fb:65:8c:1c:6a:fa:f3:ae:fe:4d:dd:09:da:a9:29:64:
        52:24:1a:83:9d:b1:58:3f:8a:0a:83:ea:19:22:3a:c8:79:3e:
        30:56:4a:e7:c8:3a:ca:a8:97:9a:42:ca:76:c4:49:67:6f:33:
        d9:8b:2c:8f:f7:b4:da:62:83:47:59:33:01:8a:10:84:67:64:
        3c:08:8e:5f:64:0a:a0:ea:bc:63:91:1c:e5:a9:5f:d7:30:bd:
        5b:53:64:d5:10:01:91:e3:0a:26:2d:fd:38:e5:a7:da:2f:50:
        93:1a:08:cb
```

# デジタル署名
##　デジタル署名で何ができるか？
* 改ざんやなりすましの検知
* 否認の防止

## 具体的に発生する行為は？
* メッセージの署名の作成
* メッセージの署名を検証

## どのようにして行うか？
* 署名は署名者が秘密鍵を用いて行う。(=秘密鍵で暗号化する。)
* 署名の検証は検証者たちが公開鍵を用いて行う。(=公開鍵で復号化する。）

*基本的にメッセージに対して直接署名することはない。
（メッセージのハッシュ値に対して行う。)

よって
メッセージ⇨ハッシュ関数を通してハッシュ値作成⇨秘密鍵で署名がフローになる。

## 公開鍵暗号とデジタル署名の鍵の使い方について
|  | 秘密鍵 | 公開鍵 |
|:-----------|------------:|:------------:|
| 公開鍵暗号       |  受信者が復号化に使う |     送信者たちが暗号化に使う     |
| デジタル署名     |  署名者が署名の作成に使う |    検証者たちが検証に使う    |
| 鍵は誰が持つ？     | 個人が持つ |    必要な人は誰でも持っていて良い    |

## 認証局
認証局(certification authority:CA)は証明書の管理を行う人。
発行された証明書の内容は以下のようなものが含まれる。

* 申請者（運営者情報)
* 発行者(認証局）情報
* 申請者の公開鍵
* 認証局の署名

## 中間証明書とルート証明書の違い
SSL接続する時ブラウザは下層から順に証明書をたどり、最上位のルート証明書までは確認して検証する。

具体的には認証局はサーバ証明書を発行するとともに、認証局の証明書も送られてくる。
もしその認証局も他の認証局から署名を受けている場合、さらにその署名を受けた認証局の証明書もつけて
送られてくる。

最終的には一番上位に位置するルート認証局と呼ばれる認証局の証明書が必ず送られてくる。

ルート証明書はあらかじめブラウザに組み込まれているので、それを照合することによって、
正当性を確認する。

![image](https://qiita-image-store.s3.amazonaws.com/0/122149/94464858-3b0d-5e2a-6f14-cdd0b794fc31.png)

## ルート証明書の見方
chromeの場合で説明。
1. 　ブラウザの設定をクリック
2. 　詳細設定を表示をクリック
3. 　HTTPS/SSLの証明書の管理をクリック

# 暗号化
## 暗号化までの手順
1. ユーザーがhttpsから始まるURLのリンクにアクセス
2. アクセスされたwebサーバはwebブラウザにサーバ証明書を送る。証明書にはサーバの公開鍵が入っている。
3. クライアントはサーバ証明書を受け取り認証を行う。
4. 認証が済むとクライアントは共通鍵をサーバの公開鍵を使って暗号化する。
5. サーバは自身の秘密鍵を使って共通鍵を取り出す。

## 認証について
クライアントはwebサーバにアクセスし、サーバ証明書を送ってもらう。
1. ルート証明書の正当性の確認
送られてきた証明書にはルート証明書の署名が付いているので、ブラウザに組み込まれている署名と比較し、ルート証明書が問題ないことを確認する。
2. サーバ証明書の正当性の確認
ルート認証局の署名をルート認証局の公開鍵で復号したデータとサーバ証明書のハッシュ値が一致するかを確認する。

図で見ると以下のような流れになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/122149/d56d70a5-f32b-a774-6466-20fea910e22d.png)
### 一方向性ハッシュ関数

#### 何ができるか？
完全性を証明できる。
つまり、書き換えられたりしていないかの確認ができる。

#### 性質
* ハッシュ値から元のメッセージを推測するのは困難
* メッセージが1ビット異なると全く異なるハッシュ値が生成される。

#### 一方向性ハッシュ関数の例
* MD4,MD5(MD:MEssageDigestの略)
* SHA-1,SHA-256

#　証明書署名要求ファイルの作成方法

##秘密鍵の作成
opensslコマンドを用いて鍵を作成する。

```
$ openssl genrsa -rand `echo $RANDOM` 2048 > test-`date "+%Y%m"`.pem
0 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
...................+++
................................................+++
e is 65537 (0x10001)
#確認
$ ls
test-201605.pem
```
## CSRキーを作成
Country等を標準入力する。
Corp名等はテストのため適当に作成。

```
#CSRキー作成
$ openssl req -new -key test-201605.pem -out CSR-test-`date "+%Y%m"`.pem
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) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Minato-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SSL Test Corp
Organizational Unit Name (eg, section) []:test-201605
Common Name (e.g. server FQDN or YOUR name) []:test.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

#確認
$ ls
CSR-test-201605.pem test-201605.pem

```