nginx + rapid-sslの導入方法を書きます。SSLって何かとめんどくさいイメージありますが、ファイルがどれがどれかわからなくなるから問題なのです。仕組みがわかっていてもファイルがどれがどれかわからなくなります。この時点でめんどくさいですね。でも簡単になるように説明します。なんでめんどくさい書き方したブログしかないんだよ(・∀・) という不満があったので。
1.Rapid-SSLで暗号鍵を作成
http://www.rapid-ssl.jp/
でSSLを取得します。年間で2,600円ですね。
https://www.rapid-ssl.jp/tools/makePkeyCsr2048.php
ダイレクトアクセスできない場合は
トップページ> 新規お申し込み > お申込みフォーム > CSR作成ツールより
で2048ビットの秘密鍵の作成を行います。このツールを使ったほうが楽で確実です。
- 秘密鍵のパスワード - コモンネーム(Common Name) [ 例) ssl.yourdomain.com ] - 正式英語組織名 [ 例) Hentai, Inc. ] - 部門名 [ 例) Design ] - 市区町村名 [ 例) Kanazawa-shi ] - 都道府県名 [ 例) Ishikawa ]
コモンネームはSSL接続の際のURL(FQDN)になります。ここ注意。
・秘密鍵 (cert.key ※1)
-----BEGIN RSA PRIVATE KEY----- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -----END RSA PRIVATE KEY-----
・CSR (cert.csr)
-----BEGIN CERTIFICATE REQUEST----- BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB -----END CERTIFICATE REQUEST-----
の2つが表示されます。
cert.key, cert.csrとしてファイルに保存してください。
/etc/nginx/ssl に私は保存しました。
2.Rapid-SSLで登録支払い・メールの確認
https://www.rapid-ssl.jp/ssl/orderForm.php
のオーダーフォームより必要事項を入力。CSRの貼り付けの項目では上記のcert.csrの内容を貼り付け。ショッピングの感覚でクレジット決済まで進みます。承認メールアドレスという項目は postmaster@yourhost.com などでメールを受け取る必要があります。こちらは怠らずおこなってください。
IDがメールで届き、メールが本当に届いているかの確認を行います。
https://www.rapid-ssl.jp/rapidssl-support/ssl-support.htm
でステータスの確認を行います。メールに書かれているURLをクリックしRapidSSLのサイトより認証作業を行います。
ステータス = 証明書発行完了
になるまでがんばってください。
3.メールの確認、暗号キーのメールの受取り
【通知】 SSL サーバ証明書発行完了のお知らせ
というメールが届くはずです。私はこのようなタイトルでした。内容は
SSLサーバ証明書:
-----BEGIN CERTIFICATE----- CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -----END CERTIFICATE-----
中間証明書:
-----BEGIN CERTIFICATE----- DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD -----END CERTIFICATE-----
の2つです。確認できればOKです。
4.サーバ証明書+中間証明書を合体 (・∀・)
nginxではメールで届いた2つの証明書:SSLサーバ証明書、中間証明書をひとつにまとめたファイルにします。
合体証明書 ( cert.pem ※2 )
-----BEGIN CERTIFICATE----- CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD -----END CERTIFICATE-----
としてcert.pemを/etc/nginx/sslに保存。
ここすごく重要なので何度も読みなおすように。
5.ファイルの確認
cert.key ※1とcert.pem ※2がしっかりと手元にあるか確認してください。
cert.key ※1= Rapid-ssl登録時にWEBサイトで作成したものです(秘密鍵)。 cert.pem ※2= メールで送られてきた証明書を2つ合体させたものです(合体証明書)。
この2つがあればnginxのSSLサーバは動きます。
本記事では下記に保存したとして進めてあります。
/etc/nginx/ssl/cert.key /etc/nginx/ssl/cert.pem
6.サーバ設定
nginxのconfファイルを書き換えます。
server { listen 443; server_name yourdomain.com; ssl on; # 秘密鍵 (cert.key ※1) ssl_certificate_key /etc/nginx/ssl/cert.key; # 合体証明書 (cert.pem ※2) ssl_certificate /etc/nginx/ssl/cert.pem; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; access_log /var/log/nginx/ssl_yourdomain.com.log; error_log /var/log/nginx/ssl_yourdomain.com.error.log; root /var/www/yourdomain.com; index index.php; }
nginx -tコマンドなどを入力すると
# nginx -t Enter PEM pass phrase: 2012/03/19 00:00:00 [info] 00000#0: the configuration file /etc/nginx/nginx.conf syntax is ok 2012/03/19 00:00:00 [info] 00000#0: the configuration file /etc/nginx/nginx.conf was tested successfully
パスワード入力が求められます。Rapid-ssl登録時のものを入力しましょう。
エラーがなければあとは普通に再起動です。
nginxの設定ファイル(アプリケーション)
symfony1.4をnginxでSSL化するときのnginx.confファイル例です
fastcgi_param HTTPS on は見落としがちですので注意してください。
server { listen 443; server_name yourdomain.com; ssl on; # 秘密鍵 (cert.key ※1) ssl_certificate_key /etc/nginx/ssl/cert.key; # 合体証明書 (cert.pem ※2) ssl_certificate /etc/nginx/ssl/cert.pem; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; access_log /var/log/nginx/ssl_yourdomain.com.log; error_log /var/log/nginx/ssl_yourdomain.com.error.log; root /var/www/yourdomain.com; index index.php; location / { if (-f $request_filename) { expires max; break; } if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") { rewrite ^(.*) /index.php last; } } location /sf/ { root /usr/share/php/data/symfony/web; } location ~ \.php($|/) { set $script $uri; set $path_info ""; if ($uri ~ "^(.+\.php)(/.+)") { set $script $1; set $path_info $2; } fastcgi_pass 127.0.0.1:9000; include /etc/nginx/fastcgi_params; fastcgi_param HTTPS on; # PHPで_SERVER[HTTPS]のため fastcgi_param SCRIPT_FILENAME /var/www/yourdmain.com/web$script; fastcgi_param PATH_INFO $path_info; fastcgi_param SCRIPT_NAME $script; } }
nginx起動時に求められるパスワードを自動化するには?
# cp cert.key cert.key.org # openssl rsa -in cert.key.org -out cert.key
nginxテスト時のエラー
"routines:X509_check_private_key:key values mismatch"
のエラーはパスワードが違う場合に出るみたいです。確認してみてください。
参考になる:
http://dogmap.jp/2011/05/10/nginx-ssl/
nginxスタート時のエラー(nginx入れ替えなど)
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] still could not bind()
なんどnginx再起動しても、ポート専有してるんじゃね?って出ることがあるのですが、80番ポートのソケットプロセスを直接killすることでエラーは出なくなります。あまり使わないfuserコマンドでソケットプロセスをkillします。
# fuser -k 80/tcp