nginxでhttps!自己署名証明書でSSL設定してみよう
2017/01/31
こんにちは、okutani(@okutani_t)です。本記事では、「nginx+自己署名証明書」でサイトをhttps化する方法を紹介します。
本番のサイトを動かすというよりは、オレオレ証明書を作って、とりあえずnginxでSSLを試してみよう、という記事です。
作業環境はVagrant上のCentOS7.2です。同じ環境で試してみたい方は以下の記事を参考に、CentOS7上のnginxが動作する環境を構築しておくと良いかと思います。
自作の証明書であれば、無料で作成することができ、本番で使う証明書を発行する前の練習として良いのではないでしょうか。
また、本記事でSSLという言葉を使っていますが、正確にはTLSです。一般的に通じやすいSSLという表記をあえて使っていますので、ご了承ください。詳しく知りたい方は「SSL TLS 違い」とかでぐぐってみてください。
では、さっそく自作の証明書を作ってnginxでサイトをhttps化してみましょう。
参考NginxでHTTPS : ゼロから始めてSSLの評価をA+にするまで Part 1 | インフラ・ミドルウェア | POSTD
スポンサーリンク
暗号化鍵と自己署名証明書の作成
では、自作の証明書を作成していきましょう。同時に暗号化鍵も必要なので、一緒に作ります。
自作の証明書を作成するには「OpenSSL」が必要です。
さらに、古いOpenSSLを使うとセキュリティが万全ではないため、最新のOpenSSLを使うようにしましょう。
OpenSSLのバージョンは次のコマンドで調べることができます。
$ openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
# もしくは
$ rpm -qa | grep openssl
openssl-1.0.1e-51.el7_2.5.x86_64
openssl-devel-1.0.1e-51.el7_2.5.x86_64
openssl-libs-1.0.1e-51.el7_2.5.x86_64
もし、OpenSSLが入っていない場合は次のコマンドでインストールできます。
$ sudo yum install openssl openssl-devel openssl-libs
OpenSSLのアップデートは以下のコマンドでおこなえます。
$ yum clean all
$ sudo yum update openssl openssl-devel openssl-libs
もし脆弱性に対応したパッチがあれば、適宜あててください。これでOpenSSLが使えるようになりました。
では、「/etc/nginx/ssl」ディレクトリを作成して、そちらに暗号化鍵と自己署名証明書を作成しましょう。
$ sudo mkdir /etc/nginx/ssl
$ sudo openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key
もしパスワードを聞かれたら適当に入力しましょう。途中で「Country Name (2 letter code) [XX]:」と聞かれますが、練習で作成しているのですべてEnterでOKです。
作成された「nginx.key」が暗号化鍵、「nginx.pem」が自己署名証明書です。ハッシュ値はSHA-256(SHA-2)を利用し、1年間有効な証明書として作成しました。
OpenSSLのオプションは「参考OpenSSLについて」あたりを一読してみてください。
暗号化鍵・自己署名証明書のアクセス権限設定
鍵が漏洩しないよう、次のように権限を設定しましょう。
$ sudo chown root:root -R /etc/nginx/ssl/
$ sudo chmod 600 /etc/nginx/ssl/*
$ sudo chmod 700 /etc/nginx/ssl
これで暗号化鍵・自己署名証明書を利用する準備が整いました。nginxでこれらを設定していきましょう。
nginxでSSL設定をおこなう
では、nginxの設定ファイルにSSL設定を記述していきます。
「/etc/nginx/conf.d/default.conf」を次のように編集しましょう。
server {
# ...
listen 443 ssl;
server_name secure.example.com;
# 自己署名証明書
ssl_certificate /etc/nginx/ssl/nginx.pem;
# 暗号化鍵
ssl_certificate_key /etc/nginx/ssl/nginx.key;
# もしパスワードを入力したら追加(今回は省略)
# ssl_password_file /etc/nginx/ssl/cert.password;
# ...
}
設定が完了したらnginxを再起動します。
$ sudo systemctl restart nginx
ブラウザでhttps付きのIPアドレスへアクセス。私の環境では「https://192.168.33.12」でした。
Firefoxで確認すると「安全な接続ではありません」と表示されました。別のブラウザから見ても同じように表示されます。
自己署名証明書を許可することで、上記のように用意しておいたサイトが表示されました。
http付きではアクセスできないことも確認してみましょう。もしくは、default.confの冒頭に次のコードを追記して、「http付きからhttps付きへリダイレクト」させても良いかと思います。
server {
listen 80;
server_name secure.example.com;
return 301 https://$host$request_uri;
}
上記のリダイレクトさせてhttpsに統一する方法は、セキュリティ的に万全ではないため、きちんと設定する場合は「HSTS nginx 対策」などで調べてみてください。
あとは、自己署名証明書から本番用の証明書に切り替えることと、default.confの内容をさらに充実させればOKですね。
参考にしたnginx書籍
nginxのhttps化の方法は、以下の参考書に詳しく載っていました。本番環境でSSL設定をする場合は必読かと思います。
参考になれば幸いです。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク