CentOS 7上でNginx用の自己署名SSL証明書を作成する方法
CentOS 7を使用していませんか?別のバージョンまたはディストリビューションを選択してください。
紹介
TLS(トランスポート層セキュリティ)およびその前身であるSSL(セキュアソケットレイヤー)は、通常のトラフィックを保護された暗号化されたラッパーで包むために使用されるWebプロトコルです。
この技術を使用することで、サーバーはサーバーとクライアント間でトラフィックを安全に送信でき、外部の者によってメッセージが傍受される可能性がありません。証明書システムは、ユーザーが接続しているサイトの身元を確認するのにも役立ちます。
このガイドでは、CentOS 7サーバー上のNginxウェブサーバーで使用するために自己署名のSSL証明書を設定します。
注:自己署名証明書は、サーバーとクライアント間の通信を暗号化します。しかし、これはウェブブラウザに含まれる信頼された証明機関によって署名されていないため、ユーザーは証明書を使用して自動的にサーバーのアイデンティティを検証することができません。その結果、ユーザーはあなたのサイトを訪れるときにセキュリティエラーが表示されます。
この制限のため、自己署名証明書は一般向けのプロダクション環境には適していません。それらは通常、テストや、信頼を確立できる別の通信手段を通じて証明書の有効性を確認できる単一のユーザーまたは少数のユーザーによって使用される非クリティカルなサービスの保護に使用されます。
より本格的な証明書ソリューションをお探しの場合は、無料の証明書認証局であるLet's Encryptをチェックしてください。CentOS 7のLet's Encrypt証明書を使用したNginxの設定に関するチュートリアルで、Let's Encrypt証明書のダウンロードと設定方法を学ぶことができます。
前提条件
このチュートリアルを完了するには、以下が必要です:
- CentOS 7の初期サーバー設定チュートリアルで説明されているように、
sudo権限を持つ非ルートユーザーが構成されたCentOSサーバー。 - Nginxはサーバーにインストールされており、CentOS 7にNginxをインストールする方法に記載されています。
始める準備ができたら、sudoユーザーとしてサーバーにログインしてください。
ステップ1 — SSL証明書を作成する
TLS/SSLは、公開証明書と秘密鍵の組み合わせを使用して動作します。SSL鍵はサーバー上で秘密に保たれます。これは、クライアントに送信されるコンテンツを暗号化するために使用されます。SSL証明書は、コンテンツを要求する誰にでも公開されます。それは、関連するSSL鍵によって署名されたコンテンツを復号するために使用できます。
サーバー上には、公開証明書を保持するために使用できる/etc/ssl/certsディレクトリがすでに存在している必要があります。また、プライベートキー ファイルを保持するための/etc/ssl/privateディレクトリも作成する必要があります。このキーの秘密性はセキュリティにとって重要であるため、不正アクセスを防ぐために権限を制限することが重要です。
- sudo mkdir /etc/ssl/private
- sudo chmod 700 /etc/ssl/private
今、OpenSSLを使って、単一のコマンドで自己署名の鍵と証明書のペアを生成することができます。
- sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
あなたは一連の質問を受けることになります。それについて説明する前に、コマンドで何が起こっているのか見てみましょう:
- openssl: これはOpenSSL証明書、鍵、およびその他のファイルを作成および管理するための基本的なコマンドラインツールです。
- req: このサブコマンドは、X.509証明書署名要求(CSR)管理を使用したいことを指定します。「X.509」は、SSLおよびTLSがその鍵と証明書の管理に従う公開鍵基盤の標準です。新しいX.509証明書を作成したいので、このサブコマンドを使用しています。
- -x509: これは、通常は証明書署名リクエストを生成する代わりに自己署名証明書を作成したいということをユーティリティに伝えることによって、前のサブコマンドをさらに変更します。
- -nodes: これはOpenSSLに対して、パスフレーズで証明書を保護するオプションをスキップするよう指示します。サーバーが起動したときに、Nginxがユーザーの介入なしにファイルを読み取れる必要があります。パスフレーズがあると、サーバーの再起動後に毎回入力しなければならないため、これが妨げられます。
- -日数 365: このオプションは、証明書が有効と見なされる期間の長さを設定します。ここで1年に設定します。
- -newkey rsa:2048: これは新しい証明書と新しい鍵を同時に生成したいことを指定しています。前のステップで証明書を署名するために必要な鍵を作成しなかったので、証明書と一緒に鍵を作成する必要があります。
rsa:2048の部分は、2048ビット長のRSA鍵を作成するように指示しています。 - -keyout: この行は、OpenSSLに生成している秘密鍵ファイルをどこに配置するかを指示します。
- -out: これは、OpenSSLにあなたが作成している証明書をどこに配置するかを指示します。
上記のように、これらのオプションはキー ファイルと証明書の両方を作成します。証明書に情報を正しく埋め込むために、サーバーについていくつかの質問が求められます。
適切にプロンプトに記入してください。最も重要な行は、共通名(例:サーバーのFQDNまたはあなたの名前)を要求するものです。サーバーに関連付けられたドメイン名またはサーバーのパブリックIPアドレスを入力する必要があります。
プロンプト全体はこのように見えるでしょう:
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:webmaster@example.com
あなたが作成した2つのファイルは、/etc/sslディレクトリの適切なサブディレクトリに配置されます。
OpenSSLを使用しているため、クライアントとの完全前方秘匿性を交渉する際に使用される強力なDiffie-Hellmanグループも作成する必要があります。
これを入力することでできます:
- sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
これには数分かかる場合がありますが、完了すると、設定で使用できる強力なDHグループが/etc/ssl/certs/dhparam.pemに作成されます。
ステップ2 — NginxをSSLを使用するように構成する
CentOSのデフォルトのNginx設定はあまり構造化されておらず、デフォルトのHTTPサーバーブロックはメイン設定ファイル内に存在します。Nginxは、追加の設定のために、/etc/nginx/conf.dディレクトリ内の.confで終わるファイルをチェックします。
このディレクトリに新しいファイルを作成して、生成した証明書ファイルを使用してコンテンツを提供するサーバーブロックを構成します。次に、HTTPリクエストをHTTPSにリダイレクトするようにデフォルトのサーバーブロックをオプションで構成できます。
TLS/SSLサーバーブロックを作成する
/etc/nginx/conf.dディレクトリにssl.confという名前のファイルを作成して開きます:
- sudo vi /etc/nginx/conf.d/ssl.conf
内部では、まずserverブロックを開きます。デフォルトでは、TLS/SSL接続はポート443を使用するため、これがあなたのlistenポートになります。server_nameは、証明書を生成する際に共通名として使用したサーバーのドメイン名またはIPアドレスに設定する必要があります。次に、生成したSSLファイルの場所を設定するために、ssl_certificate、ssl_certificate_key、およびssl_dhparamディレクティブを使用します。
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name your_server_ip;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
}
次に、サイトのセキュリティを向上させるために、いくつかの追加のSSLオプションを追加します。使用するオプションは、Cipherlist.euの推奨事項です。このサイトは、人気のソフトウェアに対する使いやすい暗号化設定を提供するように設計されています。
注: Cipherlist.euのデフォルトの推奨設定は強力なセキュリティを提供します。しかし、時には、これが古いクライアントとの互換性を犠牲にすることがあります。古いクライアントのサポートが必要な場合は、「はい、レガシー/旧ソフトウェアで動作する暗号スイートをください」と表示されたリンクをクリックすることでアクセスできる代替リストがあります。
互換性リストは、上記の2つのコメントブロックの間にあるデフォルトの提案の代わりに使用できます。どの設定を使用するかは、サポートする必要があるものによって大きく異なります。
変更したい設定のいくつかがあります。まず、上流リクエスト用の好みのDNSリゾルバーをresolverディレクティブに追加できます。このガイドではGoogleのものを使用しましたが、他の好みがある場合はこれを変更できます。
最後に、HTTP Strict Transport Security(HSTS)について、特に「プレロード」機能についてしっかりと読み込む時間を取るべきです。HSTSをプレロードすることでセキュリティが向上しますが、誤って有効にしたり、誤って設定してしまうと大きな影響を及ぼす可能性があります。このガイドでは設定をプレロードしませんが、その影響を理解している自信がある場合は変更することができます。
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name your_server_ip;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
########################################################################
# from https://cipherlist.eu/ #
########################################################################
ssl_protocols TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive 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";
##################################
# END https://cipherlist.eu/ BLOCK #
##################################
}
自己署名証明書を使用しているため、SSLスタプリングは使用されません。Nginxは単に警告を出力し、自己署名証明書のスタプリングを無効にし、正しく動作し続けます。
最後に、サイトのための残りのNginx設定を追加してください。これは、あなたのニーズに応じて異なります。あなたは、ドキュメントルートといくつかのエラーページを設定するための例のデフォルトのロケーションブロックで使用される指示のいくつかをコピーするだけです:
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name your_server_ip;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
########################################################################
# from https://cipherlist.eu/ #
########################################################################
. . .
##################################
# END https://cipherlist.eu/ BLOCK #
##################################
root /usr/share/nginx/html;
location / {
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
作業が完了したら、保存して終了してください。これは、生成されたSSL証明書を使用してトラフィックを暗号化するためにNginxを設定します。指定されたSSLオプションは、最も安全なプロトコルと暗号のみが使用されることを保証します。この例の設定は単にデフォルトのNginxページを提供するだけなので、必要に応じて変更することをお勧めします。
HTTPからHTTPSへのリダイレクトを作成する(オプション)
現在の設定では、Nginxはポート443へのリクエストには暗号化されたコンテンツで応答しますが、ポート80へのリクエストには暗号化されていないコンテンツで応答します。これは、あなたのサイトが暗号化を提供しているが、その使用を強制していないことを意味します。一部のユースケースではこれで問題ないかもしれませんが、通常は暗号化を要求する方が良いです。これは、特にブラウザとサーバー間でパスワードのような機密データが転送される可能性がある場合に重要です。
幸いにも、デフォルトのNginx設定ファイルでは、デフォルトのポート80のサーバーブロックに指示を簡単に追加することができます。これは、ssl.confの先頭にこれを挿入することで実行できます:
server {
listen 80;
listen [::]:80;
server_name your_server_ip;
return 301 https://$host$request_uri;
}
. . .
作業が完了したら、ファイルを保存して閉じてください。これにより、ポート80(デフォルト)のHTTPサーバーブロックが、設定したHTTPSサーバーブロックに着信リクエストをリダイレクトするように設定されます。
ステップ3 — Nginxで変更を有効にする
変更を行ったので、新しい設定を適用するためにNginxを再起動できます。
まず、構成ファイルに構文エラーがないことを確認する必要があります。これを行うには、次のように入力します:
- sudo nginx -t
すべてが成功すれば、あなたはこのような結果を得ることができます:
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found
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
Nginxプロセスが再起動され、設定したSSL設定が適用されます。
ステップ4 — 暗号化のテスト
さて、あなたはSSLサーバーをテストする準備ができました。
ウェブブラウザを開き、アドレスバーに https:// の後にサーバーのドメイン名またはIPを入力してください:
https://server_domain_or_IP
あなたが作成した証明書は、ブラウザの信頼できる証明書機関のいずれにも署名されていないため、下記のような恐ろしい警告が表示される可能性があります:
これは期待されることであり、正常です。あなたは証明書の暗号化の側面にのみ関心があり、ホストの信頼性の第三者による検証には関心がありません。「詳細設定」をクリックし、次に提供されたリンクをクリックして、ホストに進むことができます。
あなたは自分のサイトに連れて行かれるべきです。ブラウザのアドレスバーを見ると、部分的なセキュリティの表示があるでしょう。それは「x」のついた鍵や、感嘆符のついた三角形かもしれません。この場合、これは単に証明書が検証できないことを意味します。それでもなお、あなたの接続は暗号化されています。
Nginxを設定してHTTPリクエストをHTTPSにリダイレクトするようにした場合、リダイレクトが正しく機能しているかどうかも確認できます:
http://server_domain_or_IP
これが同じアイコンの結果になる場合、これはあなたのリダイレクトが正しく機能したことを意味します。
結論
あなたはNginxサーバーをクライアント接続のために強力な暗号化を使用するように設定しました。これにより、リクエストを安全に提供でき、外部の第三者があなたのトラフィックを読むのを防ぐことができます。


