前書き

この記事では、Nginx用の楕円曲線暗号(ECC)SSL証明書を作成する方法について説明します。 このチュートリアルの終わりまでに、本番用のより高速な暗号化メカニズムを使用できます。

従来の公開鍵暗号方式では、大きな整数を因数分解することはほぼ不可能です。 一方、ECCは、ランダムな楕円曲線を離散対数関数に分解できないこと、つまり「楕円曲線離散対数問題」またはECDLPと呼ばれる問題に依存しています。 要するに、ECCは同様のセキュリティを備えたより小さなキーを提供し、これがSSLのようなデジタル署名に適用可能なより高い暗号化パフォーマンスに変換されます。

このチュートリアルとすべてのECC証明書は、いくつかのフレーバーで提供される_楕円曲線プロトコル_に依存しています。 米国国立標準技術研究所(NIST)https://www.nsa.gov/ia/programs/suiteb_cryptography/[Suite B]は、P-256およびP-384、またはprime256v1として使用される2つの潜在的な楕円曲線を指定しています。およびsecp384r1。 簡単にするために、前者のprime256v1を使用します。これはシンプルですが実用的です。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • 新鮮なDebian 8.1ドロップレット1つ

  • sudo非ルートユーザー。https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-8のステップ2および3に従ってセットアップできます[このチュートリアル]

  • OpenSSLのインストールと更新

テストするには、OpenSSLがインストールおよび更新された2つのシステムのいずれかが必要です。

  • 別のLinuxドロップレット

  • Linuxベースのローカルシステム(Mac、Ubuntu、Debianなど)

ステップ1-Nginxのインストール

このステップでは、 `+ apt-get`と呼ばれる組み込みのパッケージインストーラーを使用します。 管理を大幅に簡素化し、クリーンインストールを促進します。

他のLinuxディストリビューションとは異なり、Debian 8には `+ sudo `がインストールされていないため、前提条件で指定されたリンクでは、 ` apt-get `を更新して ` sudo +`パッケージをインストールする必要があります。

Nginxは前述のHTTPサーバーであり、低メモリ使用量で大きな負荷を処理することに焦点を当てています。 それをインストールするには、次を実行します。

sudo apt-get install nginx

最も人気のある2つのオープンソースWebサーバーであるNginxとApache2の違いについては、https://www.digitalocean.com/community/tutorials/apache-vs-nginx-practical-considerations [この記事]を参照してください。

ステップ2-ディレクトリの作成

このセクションは簡単で短いです。 秘密鍵と証明書を覚えやすい場所に保存する必要があるため、新しいディレクトリを作成する必要があります。

sudo mkdir /etc/nginx/ssl

ステップ3-自己署名ECC証明書を作成する

このセクションでは、新しい証明書を要求して署名します。

まず、OpenSSLの「+ ecparam +」ツールを使用してECC秘密鍵を生成します。

  • `+ out `フラグは出力をファイルに送信します。 このチュートリアルでは、キーを ` / etc / nginx / ssl / +`に保存します。

  • `+ name `フラグは、楕円曲線 ` prime256v1 +`を識別します。

sudo openssl ecparam -out /etc/nginx/ssl/ -name prime256v1 -genkey

次に、証明書署名要求を生成します。

  • `+ key +`フラグは、前のコマンドで生成されたキーへのパスを指定します。

  • `+ out +`フラグは、生成された証明書へのパスを指定します。

sudo openssl req -new -key /etc/nginx/ssl/ -out /etc/nginx/ssl/

このコマンドを呼び出すと、一連のプロンプトが表示されます。

  • 共通名:サーバーのIPアドレスまたはホスト名を指定します。

  • チャレンジパスワード:提供しないでください。

  • あなた自身の裁量で他のすべてのフィールドに記入してください。 デフォルトを受け入れるには、「+ ENTER +」を押します。

You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:

最後に、証明書に自己署名します。 証明書はクライアントによって使用され、サーバーのみが読み取れるデータを暗号化します。

  • `+ x509 +`は、証明書の生成に使用されるOpenSSLツールです。

  • `+ days +`フラグは、証明書の有効期間を指定します。 この例では、証明書は1年間続きます。

  • `+ in +`は以前に生成された証明書リクエストを指定します。

sudo openssl req -x509 -nodes -days  -key /etc/nginx/ssl/ -in /etc/nginx/ssl/ -out /etc/nginx/ssl/

ファイルのアクセス許可を設定して、秘密キーと証明書を保護します。 3桁の許可コードの詳細については、https://www.digitalocean.com/community/tutorials/linux-permissions-basics-and-how-to-use-umask-on-a-vpsのチュートリアルを参照してください[Linuxの許可]。

sudo chmod 600 /etc/nginx/ssl/*

これで、証明書とそれを保護する秘密キーのセットアップの準備が整いました。

ステップ4-証明書のセットアップ

このセクションでは、キーと証明書を使用してNginx仮想ホストを構成します。 実際、サーバーはHTTPリクエストではなくHTTPSの提供を開始します。

nanoまたはお好みのテキストエディターを使用してサーバー構成ファイルを開きます。

sudo nano /etc/nginx/sites-enabled/default

構成ファイルの上部には、次のようなコードブロックがあります。

/ etc / nginx / sites-enabled / default

...
# Default server configuration
#
server {
...
}

次のいくつかの編集は、 `+ server +`ブロック内で行われます。

  1. 最初に、行の先頭にポンド記号を付けて、 `+ server +`ブロックの最初の2行をコメント化します。

etc / nginx / sites-enabled / default

server {
   # listen 80 default_server;
   # listen [::]:80 default_server;
  1. 次に、ポンド記号を削除して、「+ SSL Configuration」の下にある最初の「+ listen」行のコメントを解除します。 適切にインデントし、 `+ ssl default_server +`も削除します。

/ etc / nginx / sites-enabled / default

   # SSL Configuration
   #
   listen 443;
   # listen [::]:443 ssl default_server;
   #
  1. コメントブロックのすぐ下にあるルートディレクトリを更新します。 オリジナルは `+ server_name _; `を読み取ります。 サーバーIPを含めるように変更して、「 server_name +」を読み取ります。

  2. `+ server_name +`の後に、SSLキーと証明書パスを追加します。

/ etc / nginx / sites-enabled / default

       ssl on;
       ssl_certificate /etc/nginx/ssl/.pem;
       ssl_certificate_key /etc/nginx/ssl/.key;
  1. 最後に、SSL設定を追加します。

/ etc / nginx / sites-enabled / default

       ssl_session_timeout 5m;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       ssl_ciphers HIGH+kEECDH+AESGCM:HIGH+kEECDH:HIGH+kEDH:HIGH:!aNULL;
       ssl_prefer_server_ciphers on;

最終結果は次のようになります。

/ etc / nginx / sites-enabled / default

# Default server configuration
#
server {
       # listen 80 default_server;
       # listen [::]:80 default_server;

       # SSL configuration
       #
       listen 443;
       # listen [::]:443 ssl default_server;
       #
       # Self signed certs generated by the ssl-cert package
       # Don't use them in a production server!
       #
       # include snippets/snakeoil.conf;

       root /var/www/html;

       # Add index.php to the list if you are using PHP
       index index.html index.htm index.nginx-debian.html;

       server_name ;

       ssl on;
      ssl_certificate /etc/nginx/ssl/.pem;
      ssl_certificate_key /etc/nginx/ssl/.key;
      ssl_session_timeout 5m;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers HIGH+kEECDH+AESGCM:HIGH+kEECDH:HIGH+kEDH:HIGH:!aNULL;
      ssl_prefer_server_ciphers on;

       location / {
               # First attempt to serve request as file, then
               # as directory, then fall back to displaying a 404.
               try_files $uri $uri/ =404;
       }

これらの変更が行われたら、ファイルを保存して終了します。

Nginxを再起動して、変更を適用します。

sudo service nginx restart

手順5-ECCを使用したNginxのテスト

このセクションでは、コマンドラインを使用してサーバーをテストします。 繰り返しますが、これは(1)ローカルのLinuxベースのシステム、または(2)別のDropletで実行できます。 このコマンドを同じシェルウィンドウから実行することもできますが、より確実な成功の証明が必要な場合があります。

HTTPS 443ポートを介して接続を開きます。

+ openssl s_client -connect:443 +

キー出力の後、出力の中央までスクロールすると、次のことがわかります。

output---
SSL handshake has read 3999 bytes and written 444 bytes
---
...
SSL-Session:
...

もちろん、数字は可変ですが、これは成功です。 おめでとうございます。

終了するには、 `+ CTRL + C +`を押します。

URLにHTTPS( + https:// example.com +)を使用して、Webブラウザーでサイトにアクセスすることもできます。 ブラウザは、証明書が自己署名されていることを警告します。 証明書を表示し、ステップ4で入力した内容と一致することを確認できるはずです。

結論

これでチュートリアルが終了し、ECN証明書で安全に構成された動作中のNginxサーバーが残ります。 OpenSSLの操作の詳細については、https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs [OpenSSL Essentialsの記事]を参照してください。