さくらVPSにjprsのSSL証明書をインストール

**環境**

- CentOS（さくらVPS）
- Docker
- nginx
- openssl

#### ゴール

**https://でアクセス、http://アクセス時はhttps://でリダイレクト**
![スクリーンショット 2020-12-08 9.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/0f07fc96-3d76-61c0-51e5-2242b2de8676.png)


#### 前提

- 既にhttp://でアクセス可能とする。
- dockerで環境構築済みとする。
- opensslインストール済みとする（さくらVPSにインストールされていたバージョンを使用）。

#### SSL証明書の発行に必要なCSR（Certificate Signing Request）を作成

SSL証明書を申し込む際に必要な情報の1つ。作成方法は[jprs公式のマニュアル](https://jprs.jp/pubcert/service/manual/)を参照し作成する。
鍵ファイル作成時の<font color="Red">パスフレーズは忘れないように！</font>
![スクリーンショット 2020-12-08 10.10.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/8f36cc59-06c1-14c2-e93a-68076acc3947.png)

#### SSL証明書を購入する

使用するSSL証明書は低コストのjprsを選定。
さくらインターネットのコンパネにログインし、さくらインターネット経由で申し込む。
![スクリーンショット 2020-12-08 10.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/2f3945ae-1916-1139-75fd-0d1609ebe65a.png)
![スクリーンショット 2020-12-08 10.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/fbd96a9e-4b49-fb91-3f35-b85909606e89.png)

#### 認証ファイルをダウンロードする

認証ファイルをサーバーに設置し認証局で承認されることでSSL証明書を取得することができるようになる。
まずは、SSL証明書を購入するとさくら[インターネットの会員メニュー](https://secure.sakura.ad.jp/menu/top/)から認証ファイルをダウンロードする。
![名称未設定５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/93d688da-82e4-56d1-9295-4b972be387b5.png)
![名称未設定４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/19efbaf1-c8a4-656f-7d76-9cc0664e9f88.png)
![名称未設定２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/c22e493c-dcb1-ff96-c529-24749a9e5464.png)

ダウンロードされた認証ファイルのファイル名は数字とローマ字が混在したテキストファイル。

#### 認証ファイルをサーバーに設置する

nginxに記載されているドキュメントルート/.well-known/pki-validation配下に認証ファイルをアップロードし
ブラウザから認証ファイルの内容が参照できればOK。
![スクリーンショット 2020-12-08 10.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/6f36f2e4-b326-9c11-0198-4778bc7b9a66.png)

ドキュメントルートの確認はnginxのconfig（default.conf）を確認する。

```ruby:nginx(default.conf)

server {
    listen 80;
    server_name example.com;   
    root /work/public; <- ドキュメントルート

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
:
```

#### SSL証明書をダウンロードする

認証局で認証ファイルが承認されるとSSL証明書が発行されダウンロード可能となる。
認証ファイルを設置してから20分程度で発行されダウンロード可能となる。
![名称未設定７.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/6a3dc2be-3ffc-38e8-a501-6d6cb6d1f6a2.png)
![名称未設定２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/c22e493c-dcb1-ff96-c529-24749a9e5464.png)

#### SSL証明書をインストールする

[jprs公式のマニュアル](https://jprs.jp/pubcert/service/manual/)を参照しインストールする。
![スクリーンショット 2020-12-08 11.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/fd0edfd3-e8dc-8c2a-b559-00d06cfbabc8.png)

マニュアル中にある中間証明書のダウンロードは以下のとおり。
![スクリーンショット 2020-12-08 11.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/c5e594e7-9673-3deb-746f-0b00aa088669.png)

<font color="Red">マニュアル通りに「cat (サーバー証明書) （中間証明書） >/pathname/of/combined.crt」で中間証明書とサーバー証明証のファイルを合わせただけではnginxで起動エラーとなってしまったため、以下のように改行を挿入し編集が必要。
</font>

```ruby:combined.crt（変更前）

-----BEGIN CERTIFICATE-----
サーバー証明書
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
中間証明書
-----END CERTIFICATE-----
```

```ruby:combined.crt（変更後）

-----BEGIN CERTIFICATE-----
サーバー証明書
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中間証明書
-----END CERTIFICATE-----
```

鍵ファイル作成時のパスフレーズはテキストファイルに記載し設置する。

```ruby:pass.txt
xxxxxxxxxxxxxx <- パスフレーズ
```

docker-compose.ymlに上記で作成したファイルの配置を記載する。

```ruby:docker-compose.yml
version: "3.8"
services:
  web:
    image: nginx:1.19.2-alpine
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./src:/work
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./docker/nginx/ssl/example.com.key:/etc/pki/nginx/example.com.key <- 鍵ファイル
      - ./docker/nginx/ssl/combined.crt:/etc/pki/nginx/combined.crt <- サーバー証明書と中間証明書をあわせたもの
      - ./docker/nginx/ssl/pass.txt:/etc/pki/nginx/pass.txt <- 鍵ファイルのパスフレーズを記載したファイル
    working_dir: /work
```

nginxのconfigは以下の通り。

```ruby:nginx(default.conf)
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri; <- http://アクセス時はhttps://にリダイレクト
}

server {
    listen 443 ssl; <- sslポート番号
    server_name example.com; <- 独自ドメイン
    root /work/public; <- ドキュメントルート

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

    ssl_certificate /etc/pki/nginx/combined.crt; <- サーバー証明書と中間証明書をあわせたもの
    ssl_password_file /etc/pki/nginx/pass.txt; <- 鍵ファイル作成時のパスフレーズを記載したファイル
    ssl_certificate_key /etc/pki/nginx/example.com.key; <- 鍵ファイル
    ssl_session_timeout 5m;
}

```

#### nginx起動

```ruby:mac
xxxMacBook:~ xxx$ ssh developer@xxx.xxx.xxx.xxx
developer@xxx.xxx.xxx.xxx's password: 
Last login: Mon Dec  7 23:50:58 2020 from ------

SAKURA Internet [Virtual Private Server SERVICE]

[developer@ ~]$ cd /var/www/html/example-app/
[developer@ example-app]$ docker-compose up --build
Creating network "example-app_default" with the default driver
Building app
Step 1/9 : FROM php:7.4-fpm-buster
 ---> 58d217bf6b84
Step 2/9 : SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]
 ---> Using cache
 ---> b9de4244ddbf
Step 3/9 : ENV COMPOSER_ALLOW_SUPERUSER=1   COMPOSER_HOME=/composer
：
```

表示された！

![スクリーンショット 2020-12-08 9.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535832/0f07fc96-3d76-61c0-51e5-2242b2de8676.png)

#### 参考サイト
- [さくらVPS + nginx + SSL証明書でHTTPS通信](https://www.segmentation-fault.xyz/entry/2017/09/24/112216#SSL%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E8%B3%BC%E5%85%A5)