nginxのhttps接続に関してあまり記事が書かれていなかったので、メモ書きます。
##環境
サーバ: Amazon Linux AMI 2015.03 (HVM)
nginx: v1.6.2
###今回やりたいこと
- httpからhttpsへリダイレクトする
- ポートを443から強制的に指定したポートへ移動させる
- 中間証明書の設定
##1.httpからhttpsへリダイレクトする方法
サイトをセキュアにしたい!となればhttpからhttpsへリダイレクトしたいと思うのは当然のことだと思います。
nginxでは1行記述するだけでhttpsへリダイレクトが出来ます。
# HTTP server
#
server {
listen 80;
server_name ドメイン名;
rewrite ^ https://$http_host$request_uri? permanent;
}
##2.ポートを443から強制的に指定したポートへ移動させる
node.jsをAmazon Linuxで利用すると80、443ポートでサーバは立てられません...
そういった事を防ぐためにhttpsからアクセスが指定のポートへ飛ばすようにします。
/*upstreamで飛ばしたいポートを指定*/
upstream sample-app {
server ドメイン名:3000;
}
# HTTPS server
#
server {
listen 443;
server_name ドメイン名;
ssl on;
ssl_certificate /etc/nginx/ssl/newcert.pem;
ssl_certificate_key /etc/nginx/ssl/newkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
/*先ほど指定したupstreamと関連付ける*/
proxy_pass https://sample-app/;
}
}
##3.中間証明書の設定
nginxでは中間証明書を直接指定するモノが用意されていないため、サーバ証明書と中間証明書を結合したものを作成して、ssl_certificateで指定する必要があります。
これをせずにやるとWebサイトをnginxで立ち上げた時、Androidでサイトを開くと「このサイトは第三者によってハッキングされている可能性があります」と表示されてしまいました。
中間証明書の設定はとても観点です。サーバ証明書のファイルに中間証明書のファイルの内容を追記するだけです。
-----BEGIN CERTIFICATE-----
[サーバ証明書]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[中間証明書]
-----END CERTIFICATE-----
###最終的なソース
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream sample-app {
server ドメイン名:3000;
}
# HTTP server
#
server {
listen 80;
server_name ドメイン名;
rewrite ^ https://$http_host$request_uri? permanent;
}
# HTTPS server
#
server {
listen 443;
server_name ドメイン名;
ssl on;
ssl_certificate /etc/nginx/ssl/newcert.pem;
ssl_certificate_key /etc/nginx/ssl/newkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass https://sample-app/;
}
}
}
nginxはまだ触ってまもないのでなんとも言えませんが、もっといい方法あれば教えて下さい。