nginxでSSL接続する


nginxのhttps接続に関してあまり記事が書かれていなかったので、メモ書きます。

##環境
サーバ: Amazon Linux AMI 2015.03 (HVM)
nginx: v1.6.2

###今回やりたいこと
1. httpからhttpsへリダイレクトする
2. ポートを443から強制的に指定したポートへ移動させる
3. 中間証明書の設定


##1.httpからhttpsへリダイレクトする方法
サイトをセキュアにしたい！となればhttpからhttpsへリダイレクトしたいと思うのは当然のことだと思います。
nginxでは1行記述するだけでhttpsへリダイレクトが出来ます。

```/etc/nginx/nginx.conf

# HTTP server
#
server {
  listen       80;
  server_name  ドメイン名;
  rewrite  ^ https://$http_host$request_uri? permanent;
}

```


##2.ポートを443から強制的に指定したポートへ移動させる
node.jsをAmazon Linuxで利用すると80、443ポートでサーバは立てられません...
そういった事を防ぐためにhttpsからアクセスが指定のポートへ飛ばすようにします。


```/etc/nginx/nginx.conf
/*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でサイトを開くと「このサイトは第三者によってハッキングされている可能性があります」と表示されてしまいました。

中間証明書の設定はとても観点です。サーバ証明書のファイルに中間証明書のファイルの内容を追記するだけです。

```newcert.pem
-----BEGIN CERTIFICATE-----
[サーバ証明書]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[中間証明書]
-----END CERTIFICATE-----
```


###最終的なソース

```/etc/nginx/nginx.conf
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はまだ触ってまもないのでなんとも言えませんが、もっといい方法あれば教えて下さい。