使用 Nginx 提高 SSL 性能

使用 Nginx 提高 SSL 性能

我们的系统前端有 Nginx,后端有 Apache 代理。我们使用 SSL/TLS 进行连接。

问题:

  1. 就性能/SSL 握手而言,Nginx 是终止 SSL/TLS 连接的最佳选择吗?
  2. 我是否进行了所有必要的性能调整?我还能改进我的代码吗?

这是我的配置:

ssl_certificate /path/ssl.crt; 
ssl_certificate_key /path/ssl.key;
ssl_dhparam /path/dh.pem;
ssl_buffer_size 4k;
ssl_session_timeout 4h;
ssl_session_cache shared:SSL:20m;
ssl_session_tickets on;
ssl_trusted_certificate /path/trust.crt;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

我用Mozilla SSL 配置生成器生成下面的密码。

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

该密码是为了适应大多数浏览器。我也有严格传输安全放。

我们的系统在 Amazon AWS 上运行,使用 CloudFront。目前 SSL Labs 运行测试大约需要 130 秒。Pingdom 显示一个请求的 SSL 连接至少需要220毫秒

谢谢!

答案1

我在 nginx 和 incapsula 中遇到了一些性能问题,我发现问题与使用的密码有关。Incapsula 使用 DHE-RSA-AES128-SHA 连接,导致服务器性能低下和负载过高。我使用https://wiki.mozilla.org/Security/Server_Side_TLS并对密码进行了一些压力测试,并获得了有效的结果:

Cipher                      Worst response time
DHE-RSA-AES128-SHA         15.745s
DHE-RSA-AES256-SHA         15.271s
AES128-SHA                 1.421s
AES256-SHA                 1.765s  
DES-CBC3-SHA               1.459s

因此,如您所见,DHE-* 运行不佳,但 AES128-SHA 运行良好。因此,如果您认为存在性能问题,请构建一个包含数百或数千个连接的压力测试,并将 nginx 配置为仅使用一种密码。您应该能够查看是否有任何密码运行良好并尝试禁用它(不要忘记针对您的客户端测试最终设置,或者使用ssllabs 测试看看你是否没有阻止你的用户)

答案2

其他一些选择:-使用 CloudFront 终止 SSL,使用 http 调用您的服务器。请求通过 AWS 网络传输,这可能比公共互联网更安全,但如果您有个人或财务数据,您可能不想这样做。-终止 ELB 上的 SSL,使用 HTTP 调用您的服务器。这是在您的 VPC 和一个区域内,因此数据通过的链接较少。同样,根据您的数据,这可能不是理想的选择。

现在,您可以终止 CloudFront 上的 SSL,CloudFront 会在其边缘位置和原始服务器之间设置另一个 SSL 会话。这可能是双重 SSL,增加了您的延迟,并且可能是问题的根本原因。这可以解释为什么您的努力没有像您预期的那样成功。

相关内容