NginxのHTTPS設定
背景知識
HTTPSは、データのセキュリティを保護するために暗号化されたHTTP接続であり、暗号化プロセスについては、以下の2つのフェーズに分けることができます。
- ハンドシェイク交渉プロセスは、非対称暗号化アルゴリズムを使用して鍵を生成します。
- トランスポートプロセスは、対称暗号化アルゴリズムを使用してデータを暗号化します。
非対称アルゴリズムを使用したハンドシェイク交渉プロセスでは、サーバーは、権威あるCAによって署名された公開鍵、または証明書を発行する必要があります。これに対応して、サーバー側にはプライベートキーもあります。
したがって、HTTPSを使用するには、サーバー側が証明書を提供する必要があります。一般的には、.cer
または.crt
のサフィックスが付いたものと、それに対応するプライベートキーが必要です。一般的には、さまざまな証明書サービスプロバイダーのサービスを使用して、有料または無料、純粋に手動または自動化されたスクリプトを使用して取得できます。他の資料を参照してください。
基本設定
nginxでHTTPSを設定する場合、追加の要件がない場合は非常に簡単です。
- SSLプロトコルを使用してポート443でリッスンします。
server_name
を使用してドメイン名を指定します。これは証明書のドメイン名と一致する必要があります。ssl_certificate
を使用して証明書のパスを指定します。ssl_certificate_key
を使用してプライベートキーのパスを指定します。
server {
listen 443 ssl;
server_name www.xxx.com;
ssl_certificate /etc/nginx/ssl/www.xxx.com.crt;
ssl_certificate_key /etc/nginx/ssl/www.xxx.com.key;
}
これにより、HTTPSアクセスがサポートされます。
HTTPリダイレクト
ユーザーがHTTPプロトコルを使用してアクセスしている場合、上記の設定は機能しません。HTTPプロトコルにもアクセスできるようにするには、リダイレクト設定を追加する必要があります。具体的な構成には2つのアイデアがあります。
1つ目は、HTTPアクセスをサポートする別個の「server」を設定することです。
server {
listen 80;
server_name www.xxx.com;
return 301 https://$host$request_uri;
}
2つ目は、同じ「server」で「rewrite」を使用してリダイレクトすることです。
server {
listen 80;
listen 443 ssl;
server_name www.xxx.com;
ssl_certificate /etc/nginx/ssl/www.xxx.com.crt;
ssl_certificate_key /etc/nginx/ssl/www.xxx.com.key;
if ($scheme ! = "https") {
rewrite ^ https://$host$request_uri permanent;
}
}
よくある問題
証明書は有効ですが、ブラウザーは安全ではないと表示されます
ブラウザーが安全でないと表示される理由はいくつかあります。
- 証明書発行機関のルート証明書/中間証明書が信頼されていない
- 証明書のセキュリティメカニズムが古く、ブラウザー/オペレーティングシステムではもはや安全と見なされない
- 証明書チェーンが不完全である
証明書が有効な機関から申請された場合、通常、1および2の問題は発生しません。最も可能性が高いのは、証明書チェーンが不完全である場合です。
一般的に、セキュリティの高い証明書には、証明書自体に加えて、関連する中間証明書とルート証明書があります。ほとんどのオペレーティングシステム/ブラウザーには共通のルート証明書が組み込まれていますが、中間証明書が常に組み込まれているわけではありません。オペレーティングシステム/ブラウザーが中間証明書を見つけられない場合、安全でないと示される場合があります。
この場合、証明書を中間証明書とマージして、マージされた証明書を使用してサーバーを構成する必要があります。
具体的な操作方法。
- 適用された証明書にマージされた証明書がある場合(
fullchain.crt
などのファイル)、それを直接使用できます。 - 適用された証明書にマージされた証明書がない場合は、適用された証明書と中間証明書をマージし、2つのファイルを任意のテキストエディタで開き、2つの証明書ファイルの内容を前にサーバー証明書、後に中間証明書として貼り付け、新しいファイルとして保存します。