NginxでHTTPS通信したいとおもったので、そのまとめをしますわね
HTTPS通信とは
世の中の殆どのサイトはhttps通信になっているんじゃないでしょうか?
http通信になっているサイトで絶対に個人情報を入力しては駄目でっせ?w
間に悪いサーバが立ち入っていた場合、簡単に情報抜き取れるんでw
sがつくことで通信が暗号化されて他の人に情報を抜き取ることができなくなるのでパスワードや個人情報などは絶対にhttps通信前提
仕組み的にはSSLていう技術でブラウザとサーバ間で共通鍵というものを生成して、以降の通信をその鍵で暗号化、復号化をするっていうもんらしい 。
参考:さくら(https://ssl.sakura.ad.jp/column/ssl/)
検証
では、ローカル環境で証明書を作ってNginxに組み込んで見るところまで
秘密鍵、証明書を作成
俺もよくわかっていないんだけど、とりあえず鍵をつくって、その鍵をもとに証明書を作るっぽいんだ
秘密鍵を作成
1 2 3 4 5 |
$ openssl genrsa -out secret.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ..............+++++ ......+++++ e is 65537 (0x010001) |
csrファイル(証明書リクエスト)を作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ openssl req -new -sha256 -key secret.key -out server.csr Can't load /home/shiro/.rnd into RNG 140638303556032:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/home/shiro/.rnd 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]:JA State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: |
sanファイルを作成(ローカルで利用するドメインを入力するのがいいみたい
1 |
$ echo "subjectAltName = DNS: sample-site.com" > san.txt |
crtファイルを作成(これが証明書
1 |
$ openssl x509 -req -sha256 -days 3650 -signkey secret.key -in server.csr -out server.crt -extfile san.txt |
NginxにSSL証明書を使うように記述
以下2つの修正を入れる
- serverディレクティブを追加して443ポートでSSLを使用するようにする
- 既存の80ポートのディレクティブにもhttpsリダイレクトをするように修正
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
server { listen 80; server_name sample-site.com; return 301 https://sample-site.com; } server { listen 443; ssl on; server_name sample-site.com; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/secret.key; . . . . |
新しいディレクティブについても解説
sslディレクティブ
コンテキスト | http, server |
説明 | HTTPS通信するかどうか |
デフォルト値 | off |
ssl_certificateディレクティブ
コンテキスト | http, server |
説明 | サーバ証明書を指定する |
デフォルト値 | なし |
ssl_certificate_keyディレクティブ
コンテキスト | http, server |
説明 | サーバ証明書の秘密鍵を指定する |
デフォルト値 | なし |
リスタートして、ブラウザを開いてみたらhttpsで見れたら成功(でもオレオレ証明書だからってすげー警戒されるんだよねwそれについての回避策も確かあったはずだから別の機会で
まとめ
- https通信するためにはサーバ証明書と秘密鍵のペアが必要
- Nginxではssl, ssl_certificate, ssl_certificate_keyディレクティブを指定すれば可能
- ローカルで作った証明書はオレオレ証明書と呼ばれ、ブラウザから警告を受ける
nginxを現場で活用するための知識を、実践的なノウハウを交えて解説した書籍です。
nginxのインストール方法や基本的な設定方法からはじめ、nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。