我使用 Nginx 作为 4 个 Apache 实例的代理。我的问题是 SSL 协商需要很长时间(600 毫秒)。请参见以下示例:http://www.webpagetest.org/result/101020_8JXS/1/details/
这是我的 Nginx 配置:
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;
}
}
该机器是 Linode 上的 VPS,具有 1 G 的 RAM。有人能告诉我为什么 SSL 握手需要很长时间吗?
答案1
您需要禁用“临时 diffie-hellman”密码。浏览器无论如何都不会使用它们,但 openSSL 在与 cURL 或 apachebench 等工具一起使用时会使用它们。所以我敢打赌,pagepagetest.org 正在使用它们。
看此主题更多细节。
我个人在 nginx 中使用这些设置来根据服务器的偏好而不是浏览器强制使用最快但仍然安全的 SSL 密码:
更新2014-01-13:鉴于最近对 RC4 的攻击、针对 BEAST 的浏览器更新以及 TLS v1.2 在客户端和服务器上的更广泛可用性,此建议已经改变。
更新于 2015-10-16:当前 nginx TLS 设置 2015-10-16 按照推荐云Flare。请检查前面的链接以获取更新,因为 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;
这取代了此答案中先前的建议,该建议已被删除以避免混淆。
答案2
您可能没有一个好的熵源。/dev/urandom
存在吗?如果没有,Nginx 将在读取时阻塞/dev/random
。
你的密钥有多大?密钥越大,速度越慢。
尝试strace
运行这些进程来查看它们在做什么。
答案3
检查您是否没有在某处等待 DNS 解析。
答案4
改变
ssl_protocols SSLv2 SSLv3 TLSv1;
到
ssl_protocols SSLv3 TLSv1 SSLv2;
按照列出的顺序尝试协议。