2009/07/01

nginx ssl

2009/07/26
"ssl_prefer_server_ciphers on" があると core dump する
というレポートがあったので外してみたところ
IE と仲良くできているようです
nginx ssl_prefer_server_ciphers and MSIE 7.x core dump

2009/07/13
以下の方法だと IE と仲良く HTTPS できてませんでした
私の環境が悪いのかもしれないの情報募集中



Web Server を立てないとなってことになりました
  • 2 つの HTTPS サーバを手軽に構築したい
  • 片方は静的コンテンツ表示のみ
  • 片方は単純なリダイレクトのみ
Apache/Lighttpd/Nginx 辺りが候補かなぁと思っていたんですが
twitter で公募したら Nginx に決定

nginx で検索したら official が出てくるんで source を download
CentOS5 で開発環境も入れてない環境だったので
openssl-devel gcc pcre-devel make を rpm で入れて configure
--with-http_ssl_module って option を付ければ HTTPS ready な Makefile のできあがり
make && make install しました

設定ファイルは conf って directory に入ってる conf/nginx.conf
conf/nginx.conf に設定例が沢山書いてあるのでこれだけ見たら設定できてしまいます
http とか server とかのキーワードと {} で範囲指定して特定の設定してます
http の中に server を沢山書けばいいみたい
conf には沢山 file があるけど include で読み込んでいます

Virtual Host の方法ですが、conf/nginx.conf に
    # another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
とあるので
IP-based であれば server 毎に somename:8080 という指定で OK のようです。
log ファイルなんかも server の中で個別設定できます。

SSL の設定ですが、更に下の方に
    # HTTPS server
#
#server {
# listen 443;
# server_name localhost;

# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# 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;

# location / {
# root html;
# index index.html index.htm;
# }
#}
おぉぉ、完璧。
サーバ証明書に中間 CA 証明書が必要な場合、
apache でいうとこの SSLCertificateChainFile を設定したい場合は、
NginxHttpSslModule を見ると
サーバ証明書の後に中間 CA 証明書を連結すれば OK のようでした。

リダイレクトに関しては NginxHttpRewriteModule を見ると
適当に条件分岐した後 rewrite というコマンドで何を何処に飛ばすか設定で OK みたい
apache の mod_rewrite より分かりやすい
今回は無条件に redirect させたかったので
if とか使わずいきなり rewrite 書いてみました

で、関係箇所の抜粋が
http {
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!EXP:!ADH:!LOW:!SSLv2:!MD5;
#ssl_prefer_server_ciphers on;

server {
listen 10.0.0.1:80;
server_name sample1;
access_log logs/sample1_access.log;

rewrite ^(.*)$ https://sample1$1 permanent;
}

server {
listen 10.0.0.2:80;
server_name sample2;
access_log logs/sample2_access.log;

rewrite ^(.*)$ https://sample2$1 permanent;
}

server {
listen 10.0.0.1:443;
server_name sample1;
access_log logs/sample1_ssl.log;

ssl on;
ssl_certificate ssl/sample1.crt;
ssl_certificate_key ssl/sample1.key;

location / {
root html;
index index.html index.htm;
}
}

server {
listen 10.0.0.2:443;
server_name sample2;
access_log logs/sample2_ssl.log;

ssl on;
ssl_certificate ssl/sample2.crt;
ssl_certificate_key ssl/sample2.key;

rewrite ^(.*)$ https://sample3$1 permanent;
}
}
秘密鍵と証明書は ssl ってフォルダ作ってつっこみました
80 番に来たら 443 番に飛ばして
それぞれコンテンツ出すか他サイトに飛ばしています
ssl_ciphers  ALL:!EXP:!ADH:!LOW:!SSLv2:!MD5;
ってのは SSLCipherSuite 参照

あと、起動と終了のスクリプトどうしようかなぁと思いまして
nginx startup-script で検索してみたら
fujishinko 雑記帳 : CentOS nginx の起動スクリプト
何と
pid file は conf/nginx.conf 内で pid という変数で指定できるので
これで何もかんも完璧になってしまいました

Nginx すごい!

0 件のコメント:

コメントを投稿