【Nginx】自己署名証明書を使ってHTTPSでNginxWebサーバにアクセスしてみる【OpenSSL】

# 自己署名証明書を使ってHTTPSでNginxWebサーバにアクセスしてみる

なぜか仕事でオレオレ証明書を作って適用させないといけなくなったので、
手順メモがてらに

# 1. Nginx準備

## nginx インストール

```
# dnf install -y nginx
```

## 証明書用ディレクトリ作成

```
# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
```

# 2. SSL証明書準備

## SSL 秘密鍵(.key)作成

```
# openssl genrsa 2048 > server.key
```

## 証明書署名要求(.csr)作成

※CSR : Certificate Signing Request

```
# openssl req -new -key server.key -out /etc/nginx/tls/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]:
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) []:                
Email Address []:sbtkzks@gamil.com

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

テキトーに入力します。
全部空でもたぶん大丈夫
```

## (オレオレ)証明書(.crt)作成

```
# openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt
```

Nginxでは server.key と server.crt を設定ファイルに読み込ませることになります。

# 3. 再びNginx設定

```
# vi /etc/nginx/conf.d/ssl.conf

server {
    listen 443 ssl;

    ssl_certificate             /etc/nginx/ssl/server.crt;
    ssl_certificate_key         /etc/nginx/ssl/server.key;
}
```

- 設定反映

```
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# nginx -s reload
```

# 4. サーバにアクセスしてみる

https://[serverのIPアドレス]
にアクセス!

![webpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341857/29bfd759-e963-6227-9867-b7008b24c5a2.png)↑自己証明書なので安全じゃないといわれますが、仕方なし

![mukou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341857/e4e4cfec-6b68-d762-c912-f6728eb442bb.png)
↑アドレスバーのびっくりマークをクリック
証明書が無効といわれてますね

![cert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341857/5a2b5910-bb0a-3b74-65ee-97d586d75564.png)
↑詳細をクリック
伏せちゃってますが、発行者と発行先が同じ(=自分で署名してる)で、有効期限も先ほど設定した3650日になってます
SSLの適用自体はできているといっていいでしょう

![nginx_default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341857/ddac9a20-39a3-60cd-4fe2-f6db5ac3a206.png)
↑「詳細設定」から無理やりアクセスを試みます
Nginxデフォルトのページが出たので一応OK

これにて確認完了です

# 5. 軽く整理

クライアントがサーバにアクセスする際、つまり、ブラウザで特定のWebページにアクセスしようとするとき、
`クライアントがアクセスしようとしているページと、実際のアクセス先のページが一致している`必要がありますよね

例えば、`Amazonで買い物しようとしてAmazonのページ開いたら、それはAmazonが提供するAmazonのEcサイトでないといけない`わけですね

何を当たり前のことを　って感じがしますが、
これがもしかすると、`Amazonにそっくり似せて作られたフィッシングサイトである可能性もある`わけですね

そんなとき、このWebページ(を提供するサーバ)が、本当にそのページの管理者が提供しているものですよと証明するのが`サーバ証明書`ですね


ではどうやって証明書が正しいかを検証するのかというと、
ブラウザにインストールされている`root証明書の中に`アクセス先のサーバの`証明書発行者が入っている`必要があります

root証明書というのは基本的にPCやスマホの生産時にすでにインストールされた状態で販売されているようです

認証局はこのroot証明書に含まれています
適当にいろんなページで証明書詳細ページを見てみると、
いろいろな証明書認証局が確認できます。(DigiCert , Rapid SSL, Amazon,,,)
上記の証明書詳細画面で、発行者が認証局です

今回オレオレ発行したので、発行者がopensslコマンドを実行したサーバのホスト名になってるかと思います。
もちろん、自分のサーバがroot認証局リストに含まれているはずもなく
このサイトが安全ではないと認識されたわけですね

# 6. 次のステップ

Let's Encrypt の Certbot は無料でサーバ証明書を発行してくれます
自動更新の手順なども調べたらいくらでも出てくるので
そのうちやってみようと思います