Webサーバを構築する時にSSLを有効化する設定を行うことが良くあります。 しかし、サーバの鍵を作って、証明書を作って、それをWebサーバのconfファイルに設定してなどとしていると、「証明書」「電子署名」「.pem」「.csr」「.crt」など色々な用語が出てきてわけが分からなくなってしまいます。
そこでSSL/TLS周りの知識の整理として今回はWebサーバへの設置についてまとめていきます。
SSL/TLSプロトコル
SSL/TLSはインターネットを利用した通信において通信相手の認証・通信内容の暗号化・通信内容の改ざん検知を実現するたまのプロトコルです。このSSL/TLSを用いたHTTP通信がHTTPSです。
SSL/TLS変遷
SSLはNetscape Communicationによって開発されましたが、SSLv3.0の後これを改良し、TLSv1.0としてRFCに定められました。現在はTLSv1.3が新たに提案されています。
SSL/TLSシーケンス
SSLを使用したWebアクセスはおおまかに以下のようになります。
- クライアントはWebサーバにHTTPSアクセスする
- Webサーバはクライアントに証明書を送信する
- クライアントは証明書に証明した認証局の証明書を参照し、最終的にルート証明書を参照する。そこから公開鍵を取り出し、順次下位の認証局の証明書の検証を行う
- クライアントは通信暗号化のための共通鍵を作成し、サーバの公開鍵で暗号化する。Webサーバに送信。
- Webサーバは自信の秘密鍵で暗号化された共通鍵を復号化する。
- 以後、双方は共通鍵を用いて暗号化して通信を行う。
実際の通信自体では共通鍵を用いた共通鍵暗号化が行われています。
Webサーバへの設定
ここではnginxにSSL/TLSを設定する例を示します。
nginxの設定ファイル(/etc/nginx/conf.d/example_com.conf)に
- ポートの設定
- ssl有効化の設定
- サーバ証明書の設定
- サーバ秘密鍵の設定
をします。
server { listen 443; server_name domainname.com; ssl on; ssl_certificate /etc/nginx/ssl/example_com/ssl.crt; <- サーバの証明書 ssl_certificate_key /etc/nginx/ssl/example_com/example_com.key; <- サーバの秘密鍵 ssl_prefer_server_ciphers on; }