あまブログ

ドキドキ......ドキドキ2択クイ〜〜〜〜〜〜〜ズ!!

NginxでSSL対応サイトを作る

この記事では、Debian 11上のNginxでSSL対応サイトを作る方法を紹介します。

自己署名証明書を作成し、Nginxの設定を編集します。

Nginxの設定ファイルの詳しい解説は以下の記事を参照してください。

ama-tech.hatenablog.com

環境

  • Debian GNU/Linux 11 bullseye (さくらのVPS)
  • Nginx 1.21.6
  • OpenSSL 1.1.1

SSLの概要

まず初めに、SSLの概要を理解します。

SSLの暗号化方式

  • データのやりとりには共通鍵暗号を使う
  • 共通鍵暗号で必要となる共通鍵の受け渡しに公開鍵暗号を使う

共通鍵暗号:暗号化と復号化に同じ鍵を使う

公開鍵暗号:秘密鍵で暗号化、ペアとなる公開鍵で復号化

公開鍵証明書

  • SSL証明書、サーバー証明書とも呼ばれる
  • 認証局によるデジタル署名がついたサーバーの公開鍵のこと
    • 通信を行うサーバーが信頼できるかどうかを確認する仕組み
    • デジタル署名を自身で行なった証明書を自己署名証明書と言う(オレオレ証明書)

デジタル署名:秘密鍵で署名、ペアとなる公開鍵で検証

【公開鍵証明書発行の流れ】

図解 X.509 証明書より

手順

以下の手順で進めていきます。

  1. 公開鍵証明書の作成
  2. Nginxの設定

また、本手順では、サーバーのホスト名をtest.comとします。

1. 公開鍵証明書の作成

サーバーの秘密鍵と公開鍵証明書を作成します。

まずは、opensslをインストール。

$ sudo apt install openssl

秘密鍵と公開鍵証明書を生成。(ここで生成される公開鍵証明書は自己署名証明書)

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -subj /CN=test.com -keyout /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.crt
  • req:CSR(Certificate Signing Request:証明書署名要求)を生成するためのサブコマンド。
  • -x509:CSRではなく自己署名証明書を生成する。
  • -nodes:公開鍵証明書のパスフレーズ設定をスキップ。パスフレーズを設定するとNginxを再起動するたびに入力する必要がある。
  • -days:生成する公開鍵証明書の有効期限を指定。
  • -newkey rsa:2048:公開鍵証明書と秘密鍵を同時に生成する。rsa:2048で2048ビットのrsa鍵を指定。
  • -subj /CN=test.com:Common Nameにホスト名を指定。-subjオプションを指定しない場合、プロンプトが表示され入力を求められる。CN以外はテキトーな値でいい。
  • -keyout:生成する秘密鍵のファイル名を指定。
  • -out:生成する公開鍵証明書のファイル名を指定。

細かくやると

先程行った秘密鍵と公開鍵証明書の生成を、「秘密鍵の生成」と「公開鍵証明書の生成」に分けて行うと以下のようになります。

秘密鍵の生成

$ sudo openssl genrsa -out /etc/ssl/private/nginx.key
  • genrsa:RSA秘密鍵を生成するサブコマンド(デフォルトで2048ビットのRSA秘密鍵を生成)
  • -out:生成する秘密鍵のファイル名

公開鍵証明書の生成

$ sudo openssl req -x509 -key /etc/ssl/private/nginx.key -subj /CN=test.com -out /etc/ssl/certs/nginx.crt
  • -key:署名に使う秘密鍵を指定

  • 内容確認のコマンド
    • 公開鍵証明書の内容確認:openssl x509 -text -noout -in <公開鍵証明書のファイル名>
    • 秘密鍵の内容確認:openssl rsa -text -noout -in <秘密鍵のファイル名>
    • CSRの内容確認:openssl req -text -noout -in <CSRのファイル名>
  • OpenSSLコマンドリファレンス

2. Nginxの設定

/etc/nginx/sites-available/test.comを編集していきます。

設定ファイルを編集する前にバックアップを取ります。

$ sudo cp /etc/nginx/sites-available/test.com /etc/nginx/sites-available/test.com.bk

設定ファイルを編集します。

$ sudo vi /etc/nginx/sites-available/test.com

/etc/nginx/sites-available/test.com

server {
        listen 80;
+       listen 443 ssl;

+       ssl_certificate /etc/ssl/certs/nginx.crt;
+       ssl_certificate_key /etc/ssl/private/nginx.key;

        root /var/www/test.com/html;
        index index.html;

        server_name test.com www.test.com;

        access_log /var/log/nginx/test.com.access.log;
        error_log /var/log/nginx/test.com.error.log;
}

上記の設定では、HTTP(80番ポート)とHTTPS(443番ポート)の設定を共有しています。

つまり http://~https://~ でアクセスすることができ、HTTPの暗号化されていない通信とHTTPSの暗号化された通信の両方を許可します。

通常であれば http://~ のアクセスをhttps://~にリダイレクトして、ユーザにはhttps://~でのアクセスのみを許可します。

以下ではその設定を行います。

HTTPをHTTPSにリダイレクトする場合

server {
-       listen 80;
        listen 443 ssl;

        ssl_certificate /etc/ssl/certs/nginx.crt;
        ssl_certificate_key /etc/ssl/private/nginx.key;

        root /var/www/test.com/html;
        index index.html;

        server_name test.com www.test.com;

        access_log /var/log/nginx/test.com.access.log;
        error_log /var/log/nginx/test.com.error.log;
}

+ server {
+    listen 80;
+
+    server_name test.com www.test.com;
+
+    return 301 https://$server_name$request_uri;
+ }

Nginxを再起動して設定の変更を反映させます。

$ sudo systemctl restart nginx

以上で設定は終了です。

ブラウザから http://~https://~ でアクセスし、どちらも https://~のページが表示されればOKです。



【参考】