上周我将一个繁忙的站点切换到 TLS-everywhere 和 HTTP/2。性能并没有像希望的那样提高。事实上,根据你测量它的方式,你可以说它已经退化了。
在操作系统级别的 TCP 调整、Web 堆栈中的 TLS 配置等方面,还有很大的空间可以进一步优化服务器。为了确保我不会忽略任何需要改进的地方,我在这里发布我的思路供其他人参考在。
目前,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
我看到的问题:
验证错误: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
这个握手序列对我来说似乎很长。我在其他配置上看到的来回次数更少。我的愿望是尽量减少往返。
证书链 0、1、2、3 - 由 4 个(Comodo)证书组成,超过 5.5Kb,因此可能不适合 TCP 拥塞窗口大小(尚未验证)。可能是额外往返的原因(?)。
也许值得切换到提供较短链的 CA。有什么建议么?
密码:DHE-RSA-AES128-SHA
弱 Diffie-Hellman 密码。SSLLabs 补充说:“使用常见的 DH 素数是的,如果可能,用自定义 DH 参数替换”
因此,我的问题是:
- 我可以通过哪些方式缩短证书链?
- 我可以通过哪些方式减少握手下载大小?
- 我可以通过哪些方式减少握手往返次数?
- 哪个 CA 提供比 Comodo 更短的链?
- 您在此输出中看到任何其他问题点吗?或者我还应该测试什么?
- 我们可以通过哪些方式优化 Ubuntu 上的 TCP 配置以最大化 TLS 性能/网络吞吐量?
- 为性能选择密码套件顺序的最佳方法是什么?我运行 $ openssl speed 但不确定如何解释和操作这些数据。
您的见解将不胜感激。
让我们先对证书链问题进行排序。这应该照顾前4点。
您将收到 Comodo 的证书,您还需要更多的证书链。可以在此处找到证书列表。您将需要检查证书以找出它所签署的 CA。
确定 CA 后,下载捆绑包并将其放在与您发送的证书相同的目录中。然后,您需要使用以下命令将它们组合起来
您可能会注意到捆绑包中“缺少”最终 CA,这不会阻止您通过 ssllabs 上的这部分测试。
然后,您需要使用这两个配置行在 nginx 配置中引用此文件以及私钥文件(您显然已经这样做了,但为了完整性)
测试 nginx 配置,如果一切正常则重启
至于其余的配置。
我发现为 nginx 生成 SSL 配置的最佳站点是Mozilla Security我没有包含示例,因为仅 serverfault 就有很多
根据您的网站流量,您可能想要使用中间或现代(希望您不需要使用旧的,如果您这样做,您可能想要处理它,但这是一个不同的问题)
您不应该只是复制和粘贴这些配置而不了解设置将做什么。例如,HSTS 会对网站访问者产生长期影响。
虽然通常这些配置是“安全的”,但它们可以再优化一点。具体来说
当然,切换到 http/2 并没有提高您的网站性能可能还有其他一些原因。
例如 http/2 打开更多到服务器的连接。您是否考虑过这一点并进行了调整
worker_processes
,worker_connections
但上述内容涉及与 nginx 的 SSL 配置部分直接相关的任何内容。