導入
TLS (Transport Layer Security) とその前身である SSL (Secure Sockets Layer) は、コンピュータ ネットワーク上のトラフィックを保護および暗号化するために使用される Web プロトコルです。.
TLS/SSLを使用すると、サーバーはサーバーとクライアント間のトラフィックを安全に送信でき、外部の第三者によるメッセージの傍受を防止できます。また、この証明書システムは、ユーザーがアクセスするサイトの身元を確認するのにも役立ちます。.
このガイドでは、Ubuntu サーバー上の Nginx Web サーバーで使用するための自己署名 SSL 証明書を設定します。.
前提条件
- 始める前に、sudo 権限が設定された非 root ユーザーと、有効なファイアウォールを用意する必要があります。.
- Nginx Web サーバーもインストールする必要があります。.
- サーバーに完全な LEMP スタック (Linux、Nginx、MySQL、PHP) をインストールする場合。.
ステップ1 – TLS証明書を作成する
TLS/SSLは、公開証明書と秘密鍵の組み合わせで動作します。SSL鍵はサーバー上で秘密に保管され、クライアントに送信されるコンテンツを暗号化します。SSL証明書は、コンテンツを要求するすべてのユーザーに公開されます。SSL証明書は、関連付けられたSSL鍵で署名されたコンテンツを復号するために使用できます。.
OpenSSL を使用すると、1 つのコマンドで自己署名キー ペアと証明書を生成できます。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crtこのコマンドの各部分の機能の概要は次のとおりです。
須藤: sudoコマンドを使用すると、sudoグループのメンバーは一時的に権限を別のユーザー(デフォルトではスーパーユーザーまたはrootユーザー)に昇格できます。この場合、/etc/ディレクトリにrootユーザーまたはその他の特権アカウントのみがアクセスできる証明書と鍵のペアを作成するため、この操作が必要になります。.オープンSSL: これは、OpenSSL 証明書、キー、およびその他のファイルを作成および管理するための主要なコマンドライン ツールです。.リクエストこのサブコマンドは、X.509証明書署名要求(CSR)管理を使用することを指定します。「X.509」は、SSLとTLSが鍵と証明書の管理のために準拠している公開鍵インフラストラクチャ(PKI)規格です。新しいX.509証明書を作成するため、このサブコマンドを使用します。.- –
x509: これは、通常のように証明書署名要求を作成するのではなく、自己署名証明書を作成することを指定して、前のサブコマンドを変更します。. - –
ノード: これは、OpenSSLにパスフレーズによる証明書のセキュリティ保護オプションをスキップするように指示します。サーバーの起動時に、Nginxがユーザーの介入なしにファイルを読み込めるようにする必要があります。パスフレーズは、再起動のたびに入力する必要があるため、これを防ぎます。. -日数365: このオプションは、証明書の有効期間を指定します。ここでは1年に設定しています。.-新しいキー rsa:2048: 新しい証明書と新しい鍵を同時に生成することを指定します。前の手順で証明書の署名に必要な鍵を作成していないため、証明書と同時に作成する必要があります。rsa:2048 の部分は、2048ビット長のRSA鍵を作成するように指示しています。.-キーアウト: この行は、作成する秘密鍵ファイルをどこに配置するかを OpenSSL に指示します。.-外: これは、作成する証明書を配置する場所を OpenSSL に指示します。.
前述の通り、これらのオプションは鍵ファイルと証明書の両方を作成します。このコマンドを実行すると、証明書に情報を適切に埋め込むために、サーバーに関するいくつかの質問が表示されます。.
コマンドを正しく入力してください。最も重要な行は共有名(サーバーのFQDNまたはあなたの名前)を入力する行です。サーバーに関連付けられたドメイン名、またはおそらくサーバーのパブリックIPアドレスを入力する必要があります。.
コマンド全体は次のようになります。
Output
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com作成したファイルは両方とも、/etc/ssl ディレクトリの適切なサブディレクトリに配置されます。.
OpenSSL を使用する場合は、クライアントとのネゴシエーション時に完全な前方秘匿性を使用する強力な Diffie-Hellman (DH) グループも作成する必要があります。.
次のように入力してこれを実行できます。
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096これにはしばらく時間がかかりますが、完了すると、構成中に使用される強力な DH グループが /etc/nginx/dhparam.pem に作成されます。.
ステップ2 – SSLを使用するようにNginxを設定する
キーと証明書ファイルが /etc/ssl ディレクトリに作成されたので、それらを使用するために Nginx 設定を変更する必要があります。.
まず、SSLキーと証明書ファイルの場所に関する情報を含む設定フラグメントを作成します。次に、将来の証明書にも使用できる強力なSSL設定を含む設定フラグメントを作成します。最後に、作成した2つの設定フラグメントを使用してNginxサーバーブロックを設定し、SSLリクエストが適切に処理されるようにします。.
この Nginx 構成方法により、サーバー ブロックをクリーンな状態に保ち、共通の構成セクションを再利用可能なモジュールに配置できます。.
SSLキーと証明書を指す構成フラグメントを作成する
まず、お好みのテキストエディタを使って、/etc/nginx/snippets フォルダに新しい Nginx 設定スニペットを作成します。以下の例では nano を使用しています。.
このファイルの目的を正しく識別するには、self-signed.conf という名前を付けます。
sudo nano /etc/nginx/snippets/self-signed.confこのファイルでは、ssl_certificateディレクティブに証明書ファイルを、ssl_certificate_keyに関連付けた鍵を設定する必要があります。設定例は以下のとおりです。
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;これらの行を追加したら、ファイルを保存してエディターを終了します。nanoを使用してファイルを編集した場合は、Ctrl + X、Y、Enterの順に押すことで保存できます。.
強力な暗号化設定を持つ構成フラグメントを作成する
次に、SSL設定を定義する別の部分を作成します。これにより、Nginxに強力なSSL暗号スイートが設定され、サーバーのセキュリティ維持に役立つ高度な機能が有効になります。.
設定したパラメータは将来の Nginx 構成で再利用できるため、ファイルに汎用的な名前を付けることができます。
sudo nano /etc/nginx/snippets/ssl-params.confNginx SSLを安全に設定するには、Cipherlist.euの推奨事項を採用します。Cipherlist.euは、一般的なソフトウェアで使用されている暗号化設定を理解するのに役立つ、分かりやすいリソースです。.
目的に応じて、提供されている設定をそのままコピーしますが、最初にいくつかの小さな変更を加える必要があります。.
まず、アップストリームリクエスト用の優先DNSリゾルバを追加します。このガイドではGoogle(8.8.8.8および8.8.4.4)を使用します。.
次に、Strict Transport Securityヘッダーを指定する行をコメントアウトします。この行のコメントを解除する前に、HTTP Strict Transport Security(HSTS)について、特に「プリロード」機能についてよく読んでください。HSTSプリロードはセキュリティを強化しますが、誤って有効にしたり、誤って有効にしたりすると、広範囲にわたる悪影響を及ぼす可能性があります。.
ssl-params.conf フラグメント ファイルに次の内容を追加します。
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";自己署名証明書をご利用の場合、SSL stapling は使用されません。Nginx は警告を出力し、署名済み証明書の stapling を無効にしますが、その後は正常に動作を続けます。.
完了したら、CTRL + X キーを押してから Y キーと ENTER キーを押して、ファイルを保存して閉じます。.
SSL を使用するための Nginx の設定
必要な準備ができたので、Nginx 構成を調整して SSL を有効にできます。.
このガイドでは、/etc/nginx/sites-availableディレクトリにあるカスタムサーバーブロック設定ファイルを使用していることを前提としています。また、このガイドではNginxの前提条件チュートリアルの規則に従い、/etc/nginx/sites-available/your_domainを例として使用します。必要に応じて、設定ファイル名を実際のものに置き換えてください。.
先に進む前に、現在の構成ファイルをバックアップしてください。
sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak次に、設定ファイルを開いて設定を行います。
sudo nano /etc/nginx/sites-available/your_domain内部的には、サーバー ブロックはおそらく次のようなものから始まります。
server {
listen 80;
listen [::]:80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}
ファイルの順序が異なっていたり、ルートやディレクトリのディレクティブの代わりに、location、proxy_pass、その他のカスタム設定ディレクティブが使用されている場合があります。これは問題ありません。listenディレクティブを更新し、SSL関連の要素を追加するだけで済みます。次に、既存のサーバーブロックを変更してポート443でSSLトラフィックを処理するようにし、ポート80でリッスンしてトラフィックをポート443に自動的にリダイレクトする新しいサーバーブロックを作成します。.
既存の構成ファイルで、ポート 443 と ssl を使用するように 2 つの listen ステートメントを更新し、前の手順で作成した 2 つのフラグメント ファイルを追加します。
server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ =404;
}
}次に、最初のブロックの閉じ中括弧 (}) の後に、構成ファイルに 2 番目のサーバー ブロックを追加します。
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
return 302 https://$server_name$request_uri;
}これはポート80をリッスンし、HTTPSにリダイレクトする基本的な設定です。編集が完了したら、Ctrl + X、Y、Enterの順に押してファイルを保存し、閉じてください。.
ステップ3 – ファイアウォールを構成する
前提条件ガイドで推奨されているようにufwファイアウォールを有効にしている場合は、SSLトラフィックを許可するように設定を調整する必要があります。幸いなことに、Nginxはインストール時にufwにいくつかのプロファイルを登録します。.
次のように入力して、利用可能なプロファイルを参照できます。
sudo ufw app list以下のようなリストが表示されます。
Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSHsudo ufw status と入力すると、現在の設定を確認できます。
sudo ufw statusおそらく次の応答が生成され、Web サーバーへの HTTP トラフィックのみが許可されることを意味します。
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)HTTPS トラフィックを許可するには、「Nginx Full」プロファイルの権限を更新し、追加の「Nginx HTTP」権限を削除します。
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'sudo ufw status を実行すると、次の出力が表示されます。
sudo ufw statusOutput
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)この出力は、ファイアウォールの構成が正常に完了し、Nginx で変更を有効にする準備ができていることを確認します。.
ステップ4 – Nginxで変更を有効にする
ファイアウォールの変更と構成が完了したら、Nginx を再起動して新しい変更を適用できます。.
まず、ファイルに構文エラーがないことを確認してください。sudo nginx -t と入力することで確認できます。
sudo nginx -tすべてが成功した場合、次のような結果が表示されます。
Output
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful冒頭の警告にご注意ください。前述の通り、この設定では、署名済みの証明書がSSL暗号化を使用できないため、警告が表示されます。これは想定内の動作であり、サーバーは引き続き接続を適切に暗号化できます。.
出力結果が例と一致する場合、設定ファイルに構文エラーはありません。変更を適用するには、Nginxを再起動してください。
sudo systemctl restart nginx新しい変更が反映されてシステムが再起動されたので、テストを続行できます。.
ステップ5 – 暗号化のテスト
これで、SSL サーバーをテストする準備が整いました。.
Web ブラウザを開き、アドレス バーに https:// に続けてサーバーのドメイン名または IP アドレスを入力します。
ブラウザによっては、作成された証明書がブラウザの信頼された証明機関のいずれかによって署名されていないため、警告が表示される場合があります。
この警告は予想通りであり、正常です。当社が関心を持っているのは証明書の暗号化機能のみであり、お客様のホストの認証情報の第三者による検証ではありません。「詳細設定」をクリックし、表示されたリンクをクリックしてホストにアクセスしてください。
この時点で、サイトにリダイレクトされるはずです。この例では、ブラウザのアドレスバーに「x」が付いた鍵のアイコンが表示されます。これは証明書が検証できないことを意味します。接続は暗号化されます。このアイコンはブラウザによって異なる場合がありますのでご注意ください。.
Nginx を 2 つのサーバー ブロックで構成し、HTTP コンテンツを HTTPS に自動的にリダイレクトしている場合は、リダイレクトが正しく機能しているかどうかを確認することもできます。
同じアイコンが表示される場合は、リダイレクトが正しく機能したことを意味します。.
ステップ6 – 永続的なリダイレクトに変更する
リダイレクトが正常に機能し、暗号化されたトラフィックのみを許可することに確信がある場合は、リダイレクトを永続的にするために Nginx 設定を変更する必要があります。.
サーバー ブロック構成ファイルを再度開きます。
sudo nano /etc/nginx/sites-available/your_domain302 リダイレクトを見つけて、301 リダイレクトに変更します。
return 301 https://$server_name$request_uri;
CTRL + X、Y、ENTER の順に押してファイルを保存して閉じます。
設定に構文エラーがないか確認してください。
sudo nginx -t準備ができたら、リダイレクトを永続的にするために Nginx を再起動します。
sudo systemctl restart nginx再起動後、変更が有効になり、リダイレクトが永続的になります。.
結果
Nginxサーバーは、クライアント接続に強力な暗号化を使用するように設定されています。これにより、リクエストを安全に処理し、外部からのトラフィックの読み取りを防止できます。また、Let's Encryptから取得できる自己署名SSL証明書を使用することもできます。Let's Encryptは、無料のTLS/SSL証明書をインストールし、Webサーバー上で暗号化されたHTTPSを有効にする認証局です。.











