自己署名証明書によるNginx環境構築

自己署名証明書によるNginx環境構築

目次

概要

NginxはオープンソースのWebサーバーです。個人開発のプロジェクトから、大手の製薬会社やメガバンク等においても同じものが使われています。Nginxに拡張機能を加えた、Nginx Plus もあります。

AWSやMicrosoft Azure、IBM Cloud、Oracle Cloud 等の各種パブリッククラウド、あるいはプライベートクラウドでは、仮想サーバーを用いてNginxを使う機会が多くあるため、この教材では、仮想サーバーを用いて、Nginx環境を構築について学びます。

仮想サーバーの用意

例として、仮想環境としてVirtualBoxを使っていますが、他の仮想環境でも構いませんです。仮想サーバーは2台用意します。そして双方にIPアドレスが割り当てられ、通信ができる必要があります。

< 以下は、VirtualBoxを使った場合の例 >

仮想サーバーのスペック

  • OS:Ubutnu Server 22.04

  • 仮想CPU割り当て数 : 1

  • 仮想メモリ割り当て:2048MB(2GB)以上

  • 仮想ディスク:64GB以上

  • ネットワーク設定:NAT + ホストオンリーアダプタの構成。ホストオンリーアダプタには、固定IPを割り当てること。

  • デスクトップ環境:なし

  • SSH接続:必須 ( ユーザー名 + パスワードでもOK )

仮想サーバー の設定

  • ホストオンリーアダプタの固定IP例:192.168.253.10

  • Your server’s name (ホスト名):nginx1

  • ユーザー名 : vboxuser

  • パスワード:任意のもの

作業場所

仮想サーバーにSSH接続を行います。SSH接続先のユーザーのホームディレクトリで作業を行います。( 例 /home/vboxuser )

準備作業

タイムゾーンを日本時間に変更します。

sudo timedatectl set-timezone Asia/Tokyo

Ubuntuを最新の状態にアップデートするため、次のコマンドを実行します。

sudo apt-get update -y sudo apt-get upgrade -y

「Daemons using outdated libraries」の画面が表示されるので、Tabsキーで操作し<OK>を選んで、Enterキーを押す。

自己署名証明書の作成

SAN(Subject Alternative Name)の作成

次のコマンドを実行します。

nano example-san.txt

中身は次のように記述します。

subjectAltName = DNS:*.example.edu, IP:192.168.253.10

DNSにワイルドカードを使うことができますが、IPアドレスにワイルドカードを使うことはできません。

秘密鍵の作成 ( example-server.key )

2048bitの秘密鍵を作成するため、次のコマンドを実行します。

openssl genrsa -out example-server.key 2048

証明書署名要求の作成 ( example-server.csr )

秘密鍵 ( example-server.key ) を用い、証明書署名要求 ( example-server.csr ) を作成するため、次のコマンドを実行します。

openssl req -out example-server.csr -key example-server.key -new

証明書署名要求に必要な項目について入力を求められるので、入力します。下記は例です。空白部分は、Enterキーを押して飛ばしています。

Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Niigata Locality Name (eg, city) []:Niigata City Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:*.example.edu Email Address []:admin@example.edu Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:

サーバー証明書の作成 ( example-server.crt )

証明書署名要求 ( example-server.csr ) を自分の秘密鍵 ( example-server.key ) で署名してサーバー証明書を作成するため、次のコマンドを実行します。

openssl x509 -req -days 3650 -signkey example-server.key -in example-server.csr -out example-server.crt -extfile example-san.txt

実行結果

Certificate request self-signature ok subject=C = JP, ST = Niigata, L = Niigata City, O = Internet Widgits Pty Ltd, CN = lan.example.edu, emailAddress = admin@example.edu

サーバー証明書の配置

作成したサーバー証明書を、Ubuntuで推奨している証明書ディレクトリに複製し移動するため、次のコマンドを実行します。

sudo cp example-server.crt /etc/ssl/certs

コピーされたことを確認するため、次のコマンドを実行します。

sudo ls /etc/ssl/certs | grep example

実行結果

example-server.crt

秘密鍵の配置

作成したサーバー証明書に対応する秘密鍵を、Ubuntuで推奨している証明書ディレクトリに複製し移動するため、次のコマンドを実行します。

sudo cp example-server.key /etc/ssl/private

コピーされたことを確認するため、次のコマンドを実行します。

sudo ls /etc/ssl/private | grep example

実行結果

example-server.key

Nginxを用いたWebサーバーの構築

Nginxのインストール

sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx sudo apt update -y sudo apt install -y nginx

SSL/TLS接続設定ファイルの作成

設定ファイルの作成

sudo nano /etc/nginx/conf.d/https.conf

記述内容

server { listen 443 ssl; server_name w1.example.edu; client_max_body_size 200M; access_log /var/log/nginx/web.access.log; error_log /var/log/nginx/web.error.log; ssl_certificate /etc/ssl/certs/example-server.crt; ssl_certificate_key /etc/ssl/private/example-server.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # don't use SSLv3 ref: POODLE location / { root /usr/share/nginx/html; index index.html index.htm; } }

設定ファイルのエラーチェックをかけます。

sudo nginx -t

実行結果

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

hostsファイル

Windows 環境の場合

C:\Windows\System32\drivers\etc 下に、hostsファイルがあります。

Mac 環境の場合

/private/etc/ の下に、hostsファイルがあります。

hosts ファイルの編集

hostsファイルの末尾に追記し、保存します。

192.168.253.10 w1.example.edu

192.168.253.10 は、この資料ではNginxを動かす仮想サーバーの固定IPアドレスです。

w1.example.edu は、Nginx環境で用いるFQDNです。hostsファイルに「192.168.253.10 w1.example.edu」を記述することで、w1.example.eduにアクセスすると、192.168.253.10のIPアドレスを割り当てているサーバーに接続するようになります。hosts ファイルで管理しきれない規模の場合は、DNSを使います。

接続確認

Nginxの起動

sudo systemctl start nginx

Nginxの自動起動

sudo systemctl enable nginx

Webブラウザで、https://w1.example.edu にアクセスする。自己署名証明書であり、秘密鍵をパソコンにインストールしていないため警告が表示される。

「詳細設定」>>「w1.example.edu に進む (安全ではありません)」の順にクリックすることで、Nginxのトップページが表示される。

リバースプロキシの適用例

構築したNginx環境を活用し、チャットシステムを構築し、リバースプロキシとしてNginxを使いましょう。

デジタルハブとして使えるチャットシステムの導入