Nginx TLS性能优化

我上个星期把一个繁忙的站点切换到了TLS,而且是HTTP / 2。 绩效并没有像预期的那样有所提高。 事实上,取决于你如何衡量,你可以说它已经退化了。

有足够的空间来进一步优化服务器,在操作系统级别的TCP调整,在networking堆栈中的TLSconfiguration等。为了确保我没有忽略任何改进的地方,我在这里张贴我的思路为他人鸣钟在。

目前,SSL conf就是这样显示的。 各方控制着这方面的各种要素,我没有直接控制这一切。 域名审查。

$ openssl s_client -state -CAfile Documents/Thawte\ Server\ CA.cer -connect xxxxxx.tld:443 CONNECTED(00000003) SSL_connect:before/connect initialization SSL_connect:SSLv2/v3 write client hello A SSL_connect:SSLv3 read server hello A depth=3 /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root verify error:num=19:self signed certificate in certificate chain verify return:0 SSL_connect:SSLv3 read server certificate A SSL_connect:SSLv3 read server key exchange A SSL_connect:SSLv3 read server done A SSL_connect:SSLv3 write client key exchange A SSL_connect:SSLv3 write change cipher spec A SSL_connect:SSLv3 write finished A SSL_connect:SSLv3 flush data SSL_connect:SSLv3 read finished A --- Certificate chain 0 s:/C=xxx i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA 1 s:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root 2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root 3 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority --- Server certificate -----BEGIN CERTIFICATE----- MIIF1----shZZU y1kFXCCRo78= -----END CERTIFICATE----- subject=/C=xxx issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA --- No client certificate CA names sent --- SSL handshake has read 6240 bytes and written 328 bytes --- New, TLSv1/SSLv3, Cipher is DHE-RSA-AES128-SHA Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : DHE-RSA-AES128-SHA Session-ID: 09464B1CF8972B08267C33BF255FDA74216728E3599B24EAE02B13642C268483 Session-ID-ctx: Master-Key: ACC3529AC7C80162797397D4E3041D1720EE4BA6A8BA5D2C200F8B48ADD6960CA9E48D5FF975472A9E8B43B7023CA4E4 Key-Arg : None Start Time: 1457708322 Timeout : 300 (sec) Verify return code: 0 (ok) --- SSL3 alert read:warning:close notify closed SSL3 alert write:warning:close notify 

我看到的问题:

validation错误:num = 19:证书链中的自签名证书

我希望链条尽可能短,按照正确的顺序(这不是根据ssllabs.com),链条上不需要自签名证书。 编辑:我看到这实际上是CA根证书,它已经在浏览器的信任存储。 无论如何,这应该被删除。

SSL_connect:SSLv3读取服务器证书SSL_connect:SSLv3读取服务器密钥交换SSL_connect:SSLv3读取服务器完成SSL_connect:SSLv3写入客户端密钥交换SSL_connect:SSLv3写入更改密码规范SSL_connect:SSLv3写入完成SSL_connect:SSLv3刷新数据SSL_connect :SSLv3读完A

这个握手序列对我来说似乎很长。 我在其他configuration上看到了更less的来回。 我的愿望是保持循环到最低限度。

证书链0,1,2,3 – 由4(Comodo)证书组成,超过5.5Kb,因此可能不适合TCP拥塞窗口大小(尚未validation)。 可能是额外往返(?)的原因。

也许值得转换到提供更短链的CA. 有什么build议么?

密码:DHE-RSA-AES128-SHA

弱Diffy Helman密码。 SSLLabs增加:“使用常见的DH素数是可能的replace自定义DH参数”

因此我的问题是:

  • 我可以通过哪些方法缩短证书链?
  • 我可以通过哪些方式减less握手下载大小?
  • 我可以减less握手往返的方式有哪些?
  • 哪个CA比Comodo提供更短的链?
  • 这个输出中是否有其他问题点? 还有什么我应该testing?
  • 我们可以在Ubuntu上优化TCPconfiguration以使TLS性能/networking吞吐量最大化?
  • select密码套件顺序的最佳方法是什么? 我跑$ openssl速度,但不知道如何解释和行动这个数据。

你的见解将不胜感激。

让我们先sorting证书链问题。 这应该照顾前4点。

您将从Comodo发送证书,您还需要更多的证书链。 可以在这里find证书列表。 您将需要检查证书以找出签名的CA.

一旦确定了CA,就下载捆绑软件并将其放在与发送的证书相同的目录中。 您将需要使用以下命令将它们组合在一起

 cat name_of_file_you_were_sent name_of_bundle_file > www.example.com.crt 

您可能会注意到最终的CA从包中“丢失”,这不会阻止您通过ssllabs的这部分testing。

然后你将需要引用这个文件以及nginxconfiguration中的私钥文件(你明显已经完成了,但为了完整性)使用这两个configuration行

 ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key; 

testingnginxconfiguration,如果一切正常,重新启动


至于其余的configuration。

我发现为nginx生成一个SSLconfiguration的最佳网站是Mozilla安全我没有包括一个例子,因为有很多单独的serverfault

根据您的网站stream量,您将要使用中级或现代(希望你没有必要使用旧的,如果你这样做,你可能想要处理,但这是一个不同的问题)

你不应该只是复制和粘贴这些configuration,而不理解这些设置将会做什么。 例如,HSTS可以对网站访问者产生长期的影响。

虽然通常这些configuration是“安全的”,但它们可以进一步优化。 特别

 ssl_buffer_size 16k; #Better if you have video ssl_buffer_size 4k; #Better for quicker first byte. 

当然,为什么切换到http / 2没有提高您的网站性能可能还有一些其他的原因。

例如,http / 2打开更多的连接到服务器。 你是否解释了这一点,并调整worker_processesworker_connections但上述处理与nginx的SSLconfiguration部分直接相关的任何事情。