Nginx④自己署名証明書でTLSの設定

## はじめに
Nginxを使用したTLSの設定をローカル環境で手軽に体感することを目的としておりますので、Nginxに初めて触れる方向けの内容となっております。

## 環境
- Ubuntu 24.04
- nginx-1.26.3
- 推奨される設定状態
  - `sites-available`と`sites-enabled`ディレクトリが存在する
  - `/etc/nginx/sites-enabled/`内の設定ファイルがNginxの設定に組み込まれている

こちらのページは下記のサイトの続きとなっております。
下記のサイトをご覧いただき、実際に実践していただいた後に、こちらをご覧になった方が、より理解が深まるかと思います。

https://qiita.com/myaX/items/527ad2a7b02488aad454

## 手順1：OpenSSLのバージョン確認
Ubuntu 24.04 ではデフォルトで OpenSSL 3.x 系が搭載されているはずですが、念のため確認します。
```
openssl version
```
`OpenSSL 1.1.1`以上なら大丈夫です

## 手順2：Nginxのビルド時のOpenSSLのバージョン確認
Nginx がどの OpenSSL を使ってビルドされたかを確認します
```
nginx -V 2>&1 | grep -o 'built with OpenSSL.*'
```
`built with OpenSSL 1.1.1`以上が表示されれば大丈夫です

## 手順3：OpenSSLを使って自己署名証明書を作成
### 証明書を保存するディレクトリを作成し、移動
```bash
sudo mkdir -p /etc/nginx/ssl
cd /etc/nginx/ssl
```
### 秘密鍵の作成
```bash
sudo openssl genrsa -out server.key 2048
```

### CSR(証明書署名要求)の作成
```
sudo openssl req -new -key server.key -out server.csr
```
下記のことを質問されます。`Country Name`と`Common Name`の2点は必ず入力してください。
```bash
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.
-----
# (必須項目)国名を2文字の国コードで入力してください
Country Name (2 letter code) [AU]:JP
# 州や都道府県の名前を入力してください
State or Province Name (full name) [Some-State]:
# 都市名を入力してください
Locality Name (eg, city) []:
# 組織名（会社名）を入力してください
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
# 組織内の部門名や部署名を入力してください
Organizational Unit Name (eg, section) []:
# (必須項目)証明書が対象とするサーバーのドメイン名（FQDN）を入力してください
Common Name (e.g. server FQDN or YOUR name) []:localhost
# 証明書の所有者に関連するメールアドレスを入力してください
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
# 証明書の更新や管理時に使用するパスワードを入力してください
A challenge password []:
# 会社名が任意で必要な場合に入力してください
An optional company name []:
```

### CRT（SSLサーバ証明書）の作成
```bash
sudo openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt
```

## 手順4：TLSの設定方法
今回はNginxの初期のファイルの`default.conf`でTLS設定をしてみました。
私が`default.conf`を`sites-available`ディレクトリに移動させているため、パスがこのようになっています。
```
sudo vim /etc/nginx/sites-available/default.conf
```
```conf:/etc/nginx/sites-available/default.conf
server {
    #listen       80;
    listen 443 ssl;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

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

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';

    location / {
        root   /usr/share/nginx/html;
        index  index.html;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
```
上部の`ssl_ciphers`の行まで追加や修正を行いました。
- `ssl_certificate`
  - SSLサーバ証明書の場所を指定します
- `ssl_certificate_key`
  - 証明書に対応する 秘密鍵（KEYファイル） の場所を指定します
- `ssl_ciphers`
  - 使用する暗号スイートです。
    - 暗号スイートとは「鍵交換方式」+「認証方式」+「暗号アルゴリズム」+「ハッシュ関数」 の組み合わせです


## 手順5：sites-enabled/にシンボリックリンクを作成
```
sudo ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf
```

## 手順6：設定の反映
```
sudo systemctl reload nginx
```
`https://localhost`にアクセスすると、Nginxの初期画面が表示されます。自己署名証明書のため最初にブラウザでブロックされますが、そのまま進めばページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021963/e87da741-06d3-45ff-934c-e63907af1ca7.png)

## まとめ
以上で、自己署名証明書でTLSの設定ができました