EC2 nginx 秘密鍵～CSR～無料SSL証明書を設定する

テスト用などに無料のSSL証明書が必要になったので

##前提
すべて管理者権限で実行。
AmazonLinux2 AMI
ドメインはtest.com
ドメインのドキュメントルートは /var/www/html/test.com
バーチャルドメインの設定ファイルは /etc/nginx/conf.d/test.con.conf

ここまでの前提条件は以下の内容で作業しています。↓
[AWS EC2でnginxバーチャルホストを設定しPHPを使えるようにする](https://qiita.com/apple123/items/0716d0b053db3deca476)

#秘密鍵の作成
秘密鍵を作成するディレクトリに移動する

```
$ cd /etc/pki/tls/certs
```
秘密鍵を作成する。秘密鍵の名前は test.com.keyにする　※秘密鍵の名前は自由です
パスワードを2回聞かれますので任意の値を設定してください。※後でパスワードは解除します。

```
$ openssl genrsa -aes128 2048 > test.com.key  秘密鍵の作成

```

#CSRの作成
先ほど作成した test.com.keyをもとにCSRを作成します。
途中秘密鍵作成時に設定したパスワードを聞かれるので入力してください。
さらに、途中いくつか質問があります。
今回は無料SSL証明書なので　Common Name (ドメイン名）は正確に入力してください。
その他の質問は任意の値でもSSL証明書は発行されます

```
CSRの名前はtest.com.csrとしてCSRの作成（CSRの名前は任意でOKです）
$ openssl req -utf8 -new -key test.com.key -out test.com.csr

```

#秘密鍵のパスワード解除
秘密鍵にパスワードがあるとnginx起動時にパスワードをもとめられ,サーバーが起動しなくなってしまうのでパスワードを解除します。
パスワードを解除しても秘密鍵の鍵情報の部分は変わらないため、CSRや証明書に含まれる公開鍵もそのまま使えます。

<b>セキュリティ的に大丈夫なの？</B>との疑問もありますが、
impressのnginx実践ガイドP122 を要約すると

>起動ごとにパスワードを聞かれるのは現実的でなく、使えない。
>ならば、別ファイルにパスワードを入力し、そのパスワードをnginx起動時に自動でよみこませることもできる。
>ただし、その別ファイルの権限は秘密鍵と同じ権限で読める必要があり、セキュリティ的にすぐれているとはいえない。

とのこと。秘密鍵のパスワードを解除しても鍵情報部分はかわらないのでokなのでしょうか。

<B>最初からパスワードなしで秘密鍵つくれば？</B>
そう思うのですが、自分が所属する会社でも、
impressのnginx実践ガイドp118でも
あとから秘密鍵のパスワードを解除しているのでここでもそうします。

```
秘密鍵のパスワード解除。パスワード解除した秘密鍵はtest.com.nopass.keyとします。
パスワードなしの秘密鍵は test.com.nopasuu.keyとします。

$ openssl rsa -in test.com.key -out test.com.nopass.key
```
次はいよいよSSL証明書のインストールです。

#無料SSL証明書はLet’s Encrypt
Let’s Encryptはcerbotというパッケージが必要でインストールするにはEPELレポジトリが必要です。

#epelレポジトリがあるか確認する
amazon-linux-extrasというリポジトリからインストールできます。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-install-extras-library-software/

which コマンドを使用して、amazon-linux-extras パッケージがインストールされていることを確認します

```shell:amazon-linux-extraの確認
$ which amazon-linux-extras
/usr/bin/amazon-linux-extras ←このように表示されればOK
```

epelを有効にします。
amazon-linux-extrasコマンドでepelがどのような名前で登録されているか確認します。
自分の環境ではepelでした。

```shell:epelリポジトリ

まずepelリポジトリがあるか確認
$ yum repolist

ない場合epelリポジトリを有効にする
まずepelの登録名を確認
$ amazon-linux-extras 

epelを有効にする
$ amazon-linux-extras enable epel

インストールはyumコマンドでOK
$ yum install epel-release

```

#Cerbotのインストールと実行
いよいよcerbotをインストールします。
インストールすることでcerbotコマンドで無料SSL証明書を手に入れることができます。

```shell:cerbotのインストールと実行
serbotのインストール
$ yum install cerbot

いよいよ証明書の取得コマンドは
certbot certonly --webroot -w ドメインのドキュメントルート -d ドメイン名
なので今回は以下になります。

$ certbot certonly --webroot -w /var/www/html/test.com -d test.com
途中メールアドレスの入力などが必要になります。

```

#証明書が取得できたか確認する
↑記載のcertbot certonly --webroot -w ドメインのドキュメントルート -d ドメイン名
コマンドが成功すると
/etc/letsencrypt/live/ドメイン名のフォルダが作成されます。
今回の場合
/etc/letsencrypt/live/test.com
フォルダが作成されて、test.comフォルダの中になにやら多数ファイルが作成されていれば成功です。

#ファイルの確認をする
/etc/letsencrypt/live/ドメイン名　フォルダの中をのぞいてみる
$ cd /etc/letsencrypt/live/ドメイン名
$ ls

<b>privkey.pem</b>-------秘密鍵ファイル
<b>fullchain.pem</b> ----サーバー証明書・中間CA証明書・クロスルート証明書をつなげた証明書ファイル
　
これらのファイルをそのままnginxの
ssl_certificate
ssl_certificate_key
ディレクトリに設定します。

><b>※はまりポイント</B>
ディレクティブとファイル名の対応付けを間違えること多数あり
秘密鍵　→　ssl_certificate_key　→　privkey.pem
証明書 →　ssl_certificate　→ fullchain.pem

※最初に作成した秘密鍵はどうなったのでしょうか。わかりません。


#confファイルにSSLの設定をする
バーチャルホストは
/etc/nginx/conf.d/test.com.confに設定しているため
test.con.confに設定をします。
SSL無しのserverディレクティブをコピペしてSSL用の記述を加えればできました。
[test.com.confを作った経緯参考](https://qiita.com/apple123/items/0716d0b053db3deca476)

```conf:

server {
    listen       80;
    server_name  test.com;
   
    location / {
        root   /var/www/html/test.com;           ※ここは変える
        index  index.html index.htm index.php;
    }
    error_page   500 502 503 504  /50x.html;　　※ここはnginxの初期値のまま
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {　　　　　　　　　　　　　　　※PHPの設定
        root           /var/www/html/test.com;    ※ここも変える
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

↑のSなしのserverディレクティブをそのままコピペして、証明書の記述を追加する
server {
　　
    listen       443 ssl;　　　　　　　※80→　443　ssl　に変更しました。
    server_name  test.com;
     

　　ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;　　※無料証明書のパス
　　ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;　※秘密鍵のパス
    location / {
        root   /var/www/html/test.com;
        index  index.html index.htm index.php;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        root           /var/www/html/test.com;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

```

#httpsにリダイレクトする
```conf:httpsにリダイレクト
sなしの記述がすっきりしました。
server {
    listen       80;
    server_name  test.com;   
    return 301 https://$host$request_uri;
}
server {
    listen       443 ssl;
    server_name  test.com;
     
	ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;
    location / {
        root   /var/www/html/test.com;
        index  index.html index.htm index.php;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        root           /var/www/html/test.com;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

```

まだまだ必要な記述がありますが、とりあえず
https://test.comが表示されるようになりました。
めでたしめでたし。