Conoha VPSでドメイン作成してNginxにアルファSSL設定をする

# はじめに
自己学習のため、Nginxを使ってみたいという動機で[Conoha VPS](https://www.conoha.jp/)を使ってみました。
その時の手順をご紹介しておこうと思います。

ちなみに、NginxはDockerではなく、サーバーに直接作成しています。
今後の目標としては、Nginxをプロキシサーバーとして使用して、Dockerコンテナーでマイクロサービスを実現していきたいと思っていますが、果たしてどこまで進めるかは未定です。

# 契約とサーバー作成
[Conoha](https://www.conoha.jp/)のページから申し込みをします。
ちなみに、自分が契約したのは10月でしたが、そのすぐ後に、50万人突破キャンペーンでさらに利用料が安くなっていて、とても悔しい思いをしました。

VPS割引きっぷを使用して契約しました。これがあるとアルファSSLが無料で使用できるとのことでした。
1GBタイプを選択しました。
(画像は記事作成時のものです。キャンペーン価格になっています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/372b2a17-ded2-b574-51db-d7cf5aae5dda.png)

## ドメイン取得
### VPSメニューのドメインからドメイン取得を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/9d87f403-c3f1-4e78-d2dc-67bc2731f98e.png)

### 使用したいドメイン名を入力して検索します
ためしに、sample-testで検索してみたらこんな結果が出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/8e355278-6969-0119-ea90-f627b1532521.png)
すでに使用されているものがあるようですね。
自分が使用するドメインはこれではなかったですが、どこにも使われていないものが良いと思います。
カートに追加して、必要情報を入力して支払いに進めばドメイン取得完了です。

ドメインを取得しても、まだIPアドレスとは紐づけられていません。
これは実際にサーバーを作成して、サーバーのIPとの紐づけ設定をする必要があります。

## サーバー作成
メニューからサーバー追加を選択すると以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/8804a270-df5c-87fe-8ee9-5ecfe3808020.png)
イメージタイプとしてOSを選べたり、アプリケーションを選べるのですが、アプリケーションテンプレートを選択した場合、OSを選択することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/29923700-8426-6e71-66fe-0e099f35d52d.png)
ヘルプを見ると、アプリケーションテンプレートによってOSやバージョンが固定されています。
これが最初よくわからなくて戸惑いました。Ubuntuにしたいのに、CentOSになっているということがありました。

何度も作り直しできるので、最初はいろいろなアプリケーションテンプレートを試すのもいいかなと思います。

自分は勉強のために使いたかったので、Ubuntuを選択して、ほかは自分で構築するようにしました。

## ネームサーバー設定
メニューからDNSを選択すると、作成したドメインが表示されています(もしなかった場合は[＋ドメイン]ボタンからドメイン名を入力して保存します)。
最初は以下のものしかないかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/f857ebf0-a5f5-83a6-2ae5-f6424213cd3c.png)

これにサーバーのIPレコードを追加します。
サーバーのIPアドレスはサーバーメニューから作成したサーバーを選択すると表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/a138b72f-7772-a395-5586-cdbe88ed8b4e.png)
入力値は
- A(通常)
- @ 
- 3600
- IPアドレス
さらにもう一つ追加します
- A(通常)
- www
- 3600
- IPアドレス

@はexample.com
wwwはwww.example.com
というドメインに対するレコードとなります。
3600はTTL(Time To Live)の値で60分がデフォルトとなっているようです。

# Nginxのインストール
作成したサーバーにログインします。Tera Termを使って入ってもいいですが、メニューからコンソール使えるのでこっちを使います。
conohaのコンソールは少しくせがあるので、使いやすいほうを選べばよいかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/118b4b5e-9b61-ee72-e91d-fb4d702a085f.png)

コンソールをクリックするとシリアルとVNCから表示を選択できるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/024668bf-832c-fcc1-4bc2-0a77447f934d.png)

## Ubuntuをアップデートしておきます
rootで行っていますのでsudo書いていませんが、必要に応じてコマンドの最初にsudoいれてください。
```
sudo apt update 
```
といった感じです。
```powershell
apt update
apt upgrade
```

## Nginxのインストール
```powershell
apt-get install nginx
```
再度更新しておきます
```powershell
apt update
```
インストールされているか確認しておきましょう
```powershell
apt info nginx
```
Nginxを起動します
```powershell
systemctl start nginx
```
ステータスを確認する
```powershell
systemctl status nginx
```
こんな感じでActive: active(running)になっていればOKです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/507545e8-aa06-c4e5-e287-16643f721dfe.png)
このあと、設定ファイルを作成したりしますが、正しくできていない場合、このステータス確認でエラー内容が表示されたりするので、必要に応じて確認するとよいと思います。

## ファイアーウォール設定
conoha vpsでlinuxサーバーを作成した場合。22番ポートだけしか開かれていないようです。
コンソールから現在の設定状況を確認してみます。
```powershell
ufw status
もしくは
ufw status verbose
```
verboseを付けると詳細(冗長)なステータスが表示されてポート番号も表示されます。
状態: 非アクティブ　となっていた場合は有効化します
```powershell
ufw enable
```

NginxFullを設定する
これをすると、Nginxで使用される80番と443番ポートが開かれます。
もし一つずつ設定したい場合は個別に指定してください。
```powershell
ufw allow 'Nginx Full'
```
これでステータスを確認するとこんな感じになります(verboseで表示しています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/0f49cfe3-cc80-3f89-e5f9-a7a507421ce8.png)

## ブラウザから確認
作成してドメインを入力して以下の画面が表示されたらOKです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/66f769b9-acf7-f5f7-a7b8-75838214917d.png)

# SSL接続ファイル作成
## KEY生成
nginx関係のファイルは /etc/nginx/ に作成されています。
そこでその中にsslフォルダを作成します。フォルダ名や作成するディレクトリは他でも問題はありません。
```powershell
mkdir /etc/nginx/ssl
```
/etc/nginx/ssl/で2048bitのパスフレーズ付きの鍵を生成します。
```powershell
openssl genrsa -des3 -out sample.key 2048
Enter PEM pass phrase: 任意のパスワードを入力する
Verifying - Enter PEM pass phrase: パスワード再入力
```
このようにすると鍵のかかったPEMファイルが作成されます
作成したsample.keyを見ると
```
-----BEGIN ENCRYPTED PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END ENCRYPTED PRIVATE KEY-----
```
といった感じでENCRYPTEDとなっていて暗号化されているのが分かります。
Nginxでこの鍵を使用する場合、パスワードファイルも設定する必要があります。

## CSR生成
```powershell
openssl req -new -key sample.key -out sample.csr
```
ここでいくつかの質問が行われますが、必要なのは2か所です。
Country Name: JP
………
Common Name: ドメイン名　(www.example.comなど)
他は基本的にEnterキーで空のままでもいいです。
この辺りは、契約しているVPSによって異なるかもしれません。Conohaの場合はこれでいいみたいです。

### 作成したCSRファイルの中身をコピーします
```powershell
cat /etc/nginx/ssl/sample.csr
```

### ConohaでSSL作成する
ConohaのメニューからSSLを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/fb75d52b-2dd3-3d27-2c6f-f90dc3572327.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/e4b54e5f-4b1f-593e-e6ad-48a86ccc25d3.png)
このCSR添付にコピーしたものを貼り付けて、CSR内容確認ボタンを押すと、入力した内容が表示されるので、次へと進んでいきます。

認証まで進むと、FQDNを選択して、www付と無しの両方が表示されるので、出てきたものを、ネームサーバー設定でドメインレコード設定に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/a138b72f-7772-a395-5586-cdbe88ed8b4e.png)
wwwなし
- TEXT
- @  
- 3600
- FQDNで表示された値(globalsign-domain-verification=9F8xxxxxx..)

wwwあり
- TEXT
- www
- 3600
- FQDNで表示された値(globalsign-domain-verification=9F8xxxxxx..)

進めていって問題なければ証明書が発行されます。

## CRTを生成
SSLから証明書をダウンロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/ee9bbb04-c0fa-d9cc-f654-5ceb645ab08a.png)
この中で証明書(PEM)、中間証明書(ICA)を使用します。
```powershell
nano /etc/nginx/ssl/sample.crt
```
最初に証明書(PEM)の内容を貼り付けて、次に中間証明書(ICA)の内容を貼り付けます。
```
-----BEGIN CERTIFICATE----- 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx[証明書(PEM)の内容]xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx[中間証明書(ICA)の内容]xxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
```
保存します。
これで/etc/nginx/ssl/ の中にsample.key, sample.csr, sample.crtが作成されていると思います。
最後にsample.passfileを作成します。この中にはKEY生成のときに使用したPEM Pass Phraseを入力します
```powershell
nano /etc/nginx/ssl/sample.passfile
```
パスフレーズを入力して保存しておしまい。

# Nginxの設定
Nginxの設定は/etc/nginx/nginx.confにこんな風に設定されています。
```
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
```
これは、/etc/nginx/conf.d/ 内の～.confファイルと/etc/nginx/sites-enabled/ 内の設定ファイルを読み込むということです。
sites-enabledは実際は、sites-availableに設定ファイルを作成して、ls -sでエイリアスを生成して利用します。複数サイト設定する際はこちらを利用しますが、今回は、/etc/nginx/conf.d/ 内に設定ファイルを作成していきます。
## Nginxのconfファイルを作成
```powershell
nano /etc/nginx/conf.d/sample.conf
```
以下の内容で記述しました
```
server {
  listen 80;
  server_name ドメイン(例:sample.net);
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  server_name ドメイン(例:sample.net);
  ssl_certificate /etc/nginx/ssl/sample.crt;
  ssl_password_file /etc/nginx/ssl/sample.passfile;
  ssl_certificate_key /etc/nginx/ssl/sample.key;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
  ssl_prefer_server_ciphers off;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  location / {
    root /var/www/html/sample;
    index index.html index.htm;
  }
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root /usr/share/nginx/html;
  }
}
```
これでhttp(80番ポート)にアクセスするとhttps(443番ポート)にリダイレクトされます。
表示されるページは root /var/www/html/sample ディレクトリ内のindex.htmlとなります。
まだこのindex.htmlファイル作成していないので、次にこれを作成します。

## index.htmlファイル作成
```powershell
nano /var/www/html/sample/index.html
```
index.htmlの中身は適当でいいですが、とりあえずこんな感じで作成しました。
```html
<html lang="ja" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>SSLページ</title>
</head>
<body>
    <h3>SSLのサンプルページです</h3>
</body>
</html>
```
ここまできたらあと少しです。
## Nginxのリロード
設定ファイルの再読み込みなどをします。
```
systemctl reload nginx
```
このあと、ステータスを確認してActiveになっていれぱ大丈夫です。
もしエラーがあった場合は起動できず、何かしらメッセージが表示されるので確認して修正していきます。
```powershell
systemctl status nginx
```

リロードしたらウェブページにアクセスします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/ea73e715-cb73-1b15-bc5e-02b1e76506e8.png)
鍵マークが表示されていればOKです。

# おまけ
Nginxをステータスから確認する以外に、Nginxにはファイルが正しく設定されているか確認するコマンドがあります。
```powershell
nginx -t
```
PEM Pass Phraseを尋ねられた時は、パスフレーズを入力してください。
ここまで来るのにいろいろ調べたりして時間がかかりました。
自分が試行錯誤したときにあったことは
- 設定ファイルで "}" が抜けてた
- ssl_password_file /etc/nginx/ssl/sample.passfile; がなくてNginxが起動できなかった
- .confファイルをどこに入れたり、enable, availableが何なのかよくわからなかった

などなどです。
次はdockerで作成してみようと思います。
お疲れさまでした。