centOS6.5+unicorn+nginx+独自ドメイン(ムームー)でSSLを導入する
概要
手順として以下の作業が必要となる。
SSLはrapidSSLにする。理由は安く実績もそれなりにあるため。
SSL証明書取得準備
まず前提としてwhoisの公開代行をしているとSSLの審査が通らないっぽい。 お名前のサイトを見ると下記のような記載がある。
SSLサーバー証明書など一部サービスにおいて、本人確認の手段としてドメインのWhois情報を利用する場合は、いったん「Whois情報公開代行」を解除し、承認作業が完了したのち、再度「Whois情報公開代行」を設定してください。 そこでとりあえず一度「whois情報公開代行」を解除するところから始める。
と思ったらムームードメインで取得していたドメインだったのでムームーでwhois情報を変更。
whois情報変更手順(ムームードメイン版)
- 「ムームーのコントロールパネル」にログインする。
- 「汎用JPドメイン関係=>公開連絡窓口の編集」をクリックする。※ここ重要!
- 「弊社情報」しかない場合は「新規登録」をクリックする。
- 自身の情報を入力し「公開連絡窓口情報の登録」をクリックする。
- 「whois情報変更」をクリックする。
- 変更したいドメインを選び「公開連絡窓口番号」に先程登録した情報を選択
- 「登録者情報の変更」をクリックする。
現時点でマニュアルに記載されている内容と実際の操作画面が違う点に注意。 「whois情報変更」で直接変更出来るものと思いきやできず、予め「公開連絡窓口情報」に登録されているものをプルダウンで選択する方式となっている。ググっても情報がないため少し厄介。
公開してから10分程度してwhois情報を見てみると既に反映されている。業者によってはwhoisに登録されているメールアドレスに証明書の情報を送信するケースがあるので必ず受信出来る状況を作る。
SSL証明書取得
サイトに従い必要情報を記入する。
なお、個人の場合には「正式組織名」は登録されている名前で問題ない。
申し込みに際しCSRが必要となる。CSR作成には秘密鍵が必要で、秘密鍵の作成にはopenssl等を使い擬似乱数を生成する必要がある。
CSRをサイトに記載し申し込みを行うことでSSLサーバ証明書と中間証明書がメールでジオトラストから送られてくる。この情報をサーバに設置する。
SSL証明書をサーバに設置
ジオトラストから届いた情報をサーバに設置する。
サーバ上のどこに設置するかは任意の場所で問題ない(※後でnginxの設定時に当該パスを明示的に指定することになる)。
mkdir -p ssl/crt ssl/csr ssl/key vi ssl/csr/your-domain.csr #=>予め作成したCSR vi ssl/key/your-domain.key #=>予め作成した秘密鍵 vi ssl/crt/your-domain.crt #=>メールに記載のSSL証明書 vi ssl/crt/intermediate.crt #=>メールに記載の中間証明書
nginxに設置するためcrtファイル(SSL証明書と中間証明書)を1つのファイルに記入する。
cat ssl/crt/your-domain.crt ssl/crt/intermediate.crt > your-domain_nginx.crt
これで下準備は完了。
nginx側でSSLの設定
nginxでは以下の設定を行う。
server { listen 443; #=>SSLのポートを指定 server_name your-domain; ssl on; #=>sslをオンにする ssl_certificate /path/to/ssl/crt/your-domain_nginx.crt #=>nginx用に作ったcrtファイルパスを指定 ssl_certificate_key /path/to/ssl/key/your-domain.key #=>秘密鍵のファイルパスを指定 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #=>SSLで行使するプロトコルを指定(SSL3.0は危険なので使わない方が無難) ssl_ciphers HIGH:!ADH:!MD5; #=>詳しく調べた方が良いがこれでも問題は無い ssl_prefer_server_ciphers on; #=>サーバ側からプロトコルを指定したい場合は必要 ssl_session_cache shared:SSL:10m; #=>SSLはハンドシェイクで通信に時間が掛かるらしくこれでキャッシュさせることが可能 ssl_session_timeout 10m; #=>SSLのタイムアウトを設定 # 他の様々な処理や設定 location / { proxy_pass http://hogehoge; #=>upstreamで指定した値 proxy_set_header X-Forwarded-Ssl on; #=>SSLでの通信を明示、必要っぽい # 他の様々な処理や設定 } }
これで公開したところ早速動いた。ちなみにunicornも何か必要かと思ったけど特に何もせずに問題なくSSLで開くことが出来た。また、アプリケーション側でconfig.force_ssl = trueとかが必要かと思ったけど今のところこれがなくても問題なくSSLで通信出来ている。この辺りはよく理解出来ていないので勉強が必要。アプリケーション側でconfig.force_ssl = true
とすることで自動的にSSL接続してくれるようになる。httpとhttpsで分ける必要がなければやっておいた方が良さげ。
参考記事
transitive.info - SSL の証明書を取得と nginx、rails、devise の設定
nginx連載6回目: nginxの設定、その4 - TLS/SSLの設定 - インフラエンジニアway - Powered by HEARTBEATS