Kattsu Sandbox

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

投稿日:

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

書いている人

大阪でソフトウェアエンジニアとして働いています。

© 2020 Kattsu Sandbox