NginxforDebian8でECC証明書を作成する方法
序章
この記事では、Nginxの楕円曲線暗号(ECC)SSL証明書を作成する方法について説明します。 このチュートリアルを終了するまでに、本番環境で使用するためのより高速な暗号化メカニズムを使用できるようになります。
従来の公開鍵暗号は、大きな整数を因数分解することはほぼ不可能であることに依存しています。 一方、ECCは、ランダムな楕円曲線を離散対数関数に分解できないことに依存しています。これは、「楕円曲線離散対数問題」またはECDLPと呼ばれる問題です。 つまり、ECCは同様のセキュリティを備えた小さなキーを提供します。これにより、SSLなどのデジタル署名に適用できる暗号化パフォーマンスが向上します。
このチュートリアルとすべてのECC証明書は、楕円曲線プロトコルに依存しています。これにはいくつかの種類があります。 米国国立標準技術研究所(NIST) Suite B は、使用する2つの潜在的な楕円曲線、P-256およびP-384、別名prime256v1およびsecp384r1を指定しています。 簡単にするために、前者のprime256v1を使用します。これは、単純ですが実用的だからです。
前提条件
このチュートリアルに従うには、次のものが必要です。
- 1つの新しいDebian8.1ドロップレット
- このチュートリアルのステップ2と3に従ってセットアップできるsudo非rootユーザー。
- OpenSSLがインストールおよび更新されました
テストするには、OpenSSLがインストールおよび更新された2つのシステムのいずれかが必要です。
- 別のLinuxドロップレット
- Linuxベースのローカルシステム(Mac、Ubuntu、Debianなど)
ステップ1—Nginxをインストールします
このステップでは、apt-get
と呼ばれる組み込みのパッケージインストーラーを使用します。 管理が大幅に簡素化され、クリーンなインストールが容易になります。
前提条件で指定されたリンクで、apt-get
を更新し、sudo
パッケージをインストールする必要があります。他のLinuxディストリビューションとは異なり、Debian8にはsudo
がインストールされていません。
Nginxは前述のHTTPサーバーであり、メモリ使用量が少なく、大きな負荷を処理することに重点を置いています。 インストールするには、次のコマンドを実行します。
sudo apt-get install nginx
最も人気のある2つのオープンソースWebサーバーであるNginxとApache2の違いについては、この記事を参照してください。
ステップ2—ディレクトリを作成する
このセクションは単純で短いものです。 秘密鍵と証明書を覚えやすい場所に保存する必要があるため、新しいディレクトリを作成する必要があります。
sudo mkdir /etc/nginx/ssl
ステップ3—自己署名ECC証明書を作成する
このセクションでは、新しい証明書を要求して署名します。
まず、OpenSSLのecparam
ツールを使用してECC秘密鍵を生成します。
out
フラグは、出力をファイルに送信します。 このチュートリアルでは、キーを/etc/nginx/ssl/nginx.key
に保存します。name
フラグは、楕円曲線prime256v1
を識別します。
sudo openssl ecparam -out /etc/nginx/ssl/nginx.key -name prime256v1 -genkey
次に、証明書署名要求を生成します。
key
フラグは、前のコマンドで生成されたキーへのパスを指定します。out
フラグは、生成された証明書へのパスを指定します。
sudo openssl req -new -key /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/csr.pem
このコマンドを呼び出すと、一連のプロンプトが表示されます。
- 共通名:サーバーの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]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York Organization Name (eg, company) [Internet Widgits Pty Ltd]:Digital Ocean Tutorial Organizational Unit Name (eg, section) []:ECC Certificate Test Common Name (e.g. server FQDN or YOUR name) []:example.com Email Address []: [email protected] 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 365 -key /etc/nginx/ssl/nginx.key -in /etc/nginx/ssl/csr.pem -out /etc/nginx/ssl/nginx.pem
秘密鍵と証明書を保護するためのファイル権限を設定します。 3桁のアクセス許可コードの詳細については、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
ブロック内で行われます。
- まず、
server
ブロックの最初の2行を、行の前にポンド記号を付けてコメント化します。
etc / nginx / sites-enabled / default
server { # listen 80 default_server; # listen [::]:80 default_server;
- 次に、ポンド記号を削除して、
SSL Configuration
の下の最初のlisten
行のコメントを解除します。 適切にインデントし、ssl default_server
も削除します。
/ etc / nginx / sites-enabled / default
# SSL Configuration # listen 443; # listen [::]:443 ssl default_server; #
コメントされたブロックのすぐ下にあるルートディレクトリを更新します。 オリジナルは
server_name _;
を読み取ります。 サーバーのIPを含めるように変更して、server_name your_server_ip
と表示されるようにします。server_name
の後に、SSLキーと証明書のパスを追加します。
/ etc / nginx / sites-enabled / default
ssl on; ssl_certificate /etc/nginx/ssl/nginx.pem; ssl_certificate_key /etc/nginx/ssl/nginx.key;
- 最後に、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 your_server_ip; ssl on; ssl_certificate /etc/nginx/ssl/nginx.pem; ssl_certificate_key /etc/nginx/ssl/nginx.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のいずれかで実行できます。 同じシェルウィンドウからこのコマンドを実行することもできますが、より確実な成功の証拠が必要な場合があります。
HTTPS443ポートを介して接続を開きます。
openssl s_client -connect your_server_ip:443
キー出力の後に出力の中央までスクロールすると、次のようになります。
output--- SSL handshake has read 3999 bytes and written 444 bytes --- ... SSL-Session: ...
もちろん、数字は可変ですが、これは成功です。 おめでとう!
CTRL+C
を押して終了します。
URL(https://example.com
)でHTTPSを使用して、Webブラウザーでサイトにアクセスすることもできます。 ブラウザは、証明書が自己署名されていることを警告します。 証明書を表示して、詳細が手順4で入力したものと一致することを確認できるはずです。
##結論
これでチュートリアルは終了です。ECC証明書で安全に構成されたNginxサーバーが機能します。 OpenSSLの操作の詳細については、OpenSSLEssentialsの記事を参照してください。