Edited at

NginxでSSLを設定する方法を基本から学ぶ

More than 1 year has passed since last update.

NginxでSSLを設定したときのまとめ。

なお、SSLとTLSの違いなどは本記事では除く。


SSL通信は共通鍵と公開鍵を組み合わせて開始される

SSLは外部に通信内容が漏れないよう暗号化して通信するためのプロトコルで、基本はクライアントとサーバーで共通鍵暗号を使って通信内容を暗号化している。

ここで使用する共通鍵はもちろんクライアントとサーバーで共通の鍵でなければいけないが、SSL通信の前に共通鍵を共有すると暗号化されてないために共通鍵が漏れる可能性がある。

そのため、共通鍵自体が漏れないために、SSL通信の開始時点で共通鍵を受け渡すために公開鍵暗号を使用する。

下記の流れでSSL通信の開始を行う。

altテキスト


引用: SSLの仕組み | 基礎から学ぶSSL入門ガイド | CSP SSL


1.クライアントからサーバーへのSSL接続要求

2.サーバーからクライアントへ公開鍵を渡す

3〜5.クライアントで生成した共通鍵を公開鍵で暗号化し、サーバーに渡す

6.サーバーは暗号化された共通鍵を秘密鍵で複合する

7.クライアントがもともと持っていた共通鍵とサーバーが複合した共通鍵でSSL通信を行う

なので、サーバーとしては、まずSSL通信開始に使用する公開鍵と秘密鍵が必要である。


サーバー証明書(公開鍵+サーバーの認証情報)を用意する

サーバーが用意する公開鍵だが、本当にそのサーバーが送信しているものという証明のために、SSLでは公開鍵にサーバーの認証情報などを加えて、サーバー証明書(デジタル証明書)としてクライアントに送ることになっている。

このサーバーの認証情報は、認証局やCA(Certificate Authority)と呼ばれる第三者機関が認証している。

認証局は責任を持ってサーバーを認証するので、認証情報にそのCAのデジタル署名を記載する。

デジタル署名は認証局の秘密鍵で暗号化されているため、デジタル署名が認証局の公開鍵で複合できれば、その認証局自身が認証したことの証明になる。

認証局の公開鍵は認証局にアクセスして取得することになるが、代表的な認証局の公開鍵は最初からブラウザに入っているので、わざわざアクセスする必要はない。

ここまでやって、クライアントはサーバーのFQDN(Full Quality Domain Name)とサーバー証明書の認証情報に記載されているコモンネームを照合して正しいサーバーかどうかを判断する。

なお、認証局にはルート認証局と中間認証局の2種類があり、ルート認証局は自身で自身を認証できるのに対し、中間認証局は自身の正当性の認証をルート認証局に認証してもらわなければならない。

そのため、中間認証局にサーバーを認証してもらう場合は、中間CA証明書もサーバー証明書とともに必要になる。

上記をまとめるとサーバー側に必要なものは下記となる。

・サーバー証明書(SSL通信開始に必要な公開鍵 + サーバーの認証情報)

・SSL通信開始に必要な秘密鍵

・中間CA証明書(中間認証局に認証してもらう場合)


NginxでのSSLの設定方法

最終的にnginxには次のように設定する。


nginx.conf

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

server {
listen 443;
ssl on;
server_name www.example.com;
ssl_certificate /etc/pki/tls/certs/example_com_combined.crt; # サーバー証明書のパス
ssl_certificate_key /etc/pki/tls/private/example_com.key; # 秘密鍵のパス

location / {

}
}

ssl_certificateのパスにサーバー証明書を置き、ssl_certificate_keyのパスに秘密鍵を置く。

なお、中間CA証明書がある場合は、サーバー証明書と結合して置く。


参考サイト

SSLの仕組み | 基礎から学ぶSSL入門ガイド | CSP SSL

nginx:SSLの設定 | CSP SSL