web-dev-qa-db-ja.com

NginxでのSSLハンドシェイクのネゴシエーションがひどく遅い

Nginxを4つのApacheインスタンスへのプロキシとして使用しています。私の問題は、SSLネゴシエーションに時間がかかる(600ミリ秒)ことです。例としてこれを見てください: http://www.webpagetest.org/result/101020_8JXS/1/details/

これが私のNginx Confです:

user www-data;
worker_processes  4;


events {
    worker_connections 2048;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log  /var/log/nginx/access.log;
    sendfile        on;
    keepalive_timeout  0;
    tcp_nodelay        on;
    gzip  on;
    gzip_proxied any;
    server_names_hash_bucket_size 128;


}

upstream abc {
     server 1.1.1.1 weight=1;
     server 1.1.1.2 weight=1;
     server 1.1.1.3 weight=1;


 }


server {
    listen   443;
    server_name  blah;

    keepalive_timeout 5;

    ssl  on;
    ssl_certificate  /blah.crt;
    ssl_certificate_key  /blah.key;
    ssl_session_cache  shared:SSL:10m;
    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    location / { proxy_pass http://abc;

                 proxy_set_header X-Real-IP  $remote_addr;
                 proxy_set_header Host $Host;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

マシンは1 GのRAMを備えたLinode上のVPSです。 SSLハンドシェイクが時代遅れになっている理由を誰か教えてください。

17
Paras Chopra

「ephemeral diffie-hellman」暗号を無効にする必要があります。ブラウザーはとにかくそれらを使用しませんが、openSSLはcURLやapachebenchなどのツールで使用される場合に使用します。だから私は、webpagetest.orgがそれらを使用していることに賭けています。

詳細は this thread を参照してください。

私は個人的にnginxでこれらの設定を使用して、ブラウザーではなくサーバーの設定に基づいて、最速でまだ安全なSSL暗号を強制します。

更新2014-01-13:RC4への最近の攻撃、BEASTから保護するブラウザーの更新、およびクライアントとサーバーでのTLS v1.2のより広範な可用性を考慮して、このアドバイスは変更されました。

2015-10-16を更新: CloudFlare によって推奨される現在のnginx TLS設定2015-10-16。 TLSv1は推奨される構成から削除される可能性があるため、前のリンクで更新を確認してください。現在の設定では、現在のベストプラクティスとこの日付の最新のPCI-DSSに従って、SSLv3とRC4を無効にします。

ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers                 EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers   on;

これは、混乱を避けるために削除された、この回答の以前のアドバイスに優先します。

11
rmalayter

あなたは良いエントロピー源を持っていないかもしれません。 /dev/urandomは存在しますか?そうでない場合、Nginxは/dev/randomの読み取りをブロックします。

鍵のサイズはどれくらいですか?長いほど遅くなります。

プロセスをstraceingして、プロセスの動作を確認してください。

5
Mark Wagner

どこかでDNS解決を待っていないことを確認してください。

1
pjz

変化する

ssl_protocols  SSLv2 SSLv3 TLSv1;

ssl_protocols  SSLv3 TLSv1 SSLv2;

リストされている順序でプロトコルを試行します。

0
sledge