Назад | Перейти на главную страницу

Согласование SSL-рукопожатия на Nginx ужасно медленное

Я использую 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;

    }

}

Машина представляет собой VPS на Linode с 1 ГБ оперативной памяти. Кто-нибудь может сказать, почему рукопожатие SSL занимает много времени?

Вам необходимо отключить шифрование "эфемерного diffie-hellman". Браузеры в любом случае их не используют, но openSSL будет использовать их с такими инструментами, как cURL или apachebench. Я держу пари, что webpagetest.org их использует.

Видеть эта тема Больше подробностей.

Я лично использую эти настройки в nginx для принудительного использования самых быстрых, но все же безопасных SSL-шифров на основе предпочтений сервера, а не браузеров:

Обновление 2014-01-13: этот совет изменился с учетом недавних атак на RC4, обновлений браузера, которые защищают от BEAST, и более широкой доступности TLS v1.2 на клиентах и ​​серверах.

Обновлено 16.10.2015: текущие настройки TLS для nginx 16.10.2015 в соответствии с рекомендациями CloudFlare. Пожалуйста, проверьте предыдущую ссылку на наличие обновлений, поскольку TLSv1, вероятно, будет удален из рекомендуемой конфигурации в какой-то момент. Текущие настройки отключают SSLv3 и RC4 в соответствии с текущими рекомендациями и последним PCI-DSS на эту дату.

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;

Это заменяет предыдущий совет в этом ответе, который был удален, чтобы избежать путаницы.

У вас может не быть хорошего источника энтропии. Делает /dev/urandom существует? В противном случае Nginx заблокируется при чтении /dev/random.

Какого размера ваш ключ? Дольше - медленнее.

Пытаться straceанализируя процессы, чтобы увидеть, что они делают.

убедитесь, что вы где-то не ждете разрешения DNS.

+ Изменить

ssl_protocols  SSLv2 SSLv3 TLSv1;

к

ssl_protocols  SSLv3 TLSv1 SSLv2;

Пробует протоколы в том порядке, в котором они перечислены.