终止大量SSL连接的成本效益

我最近设置了一个基于Node.js的web套接字服务器,经过testing,它可以在一个小的EC2实例(m1.small)上每秒处理大约2000个新的连接请求。 考虑到m1.small实例的成本以及将多个实例放在支持WebSocket的代理服务器(如HAProxy)后面的能力,我们对结果非常满意。

但是,我们意识到我们还没有使用SSL进行任何testing,因此查看了许多SSL选项。 很明显,在代理服务器上终止SSL连接是理想的,因为代理服务器可以检查stream量并插入诸如X-Forward-For之类的头部,以便服务器知道请求来自哪个IP。

所以我研究了一些解决scheme,比如Pound,stunnel和stud,所有这些都允许443上的传入连接被终止,然后通过80端口上的HAProxy传递到Web服务器。 不幸的是,我发现在c1.medium(High CPU)实例上向SSL终止代理服务器发送stream量很快就消耗了所有的CPU资源,并且每秒钟只有50次左右的请求。 我尝试过使用上面列出的全部三种解决scheme,并且他们都执行了大致相同的操作,而我仍然使用OpenSSL。 我尝试使用64位非常大的高CPU实例(c1.xlarge),发现性能只能随成本线性缩放。 所以基于EC2定价,我需要支付每秒200个SSL请求的大约600美元/米,而不是每秒2000个非SSL请求的60美元/米。 当我们开始计划每秒钟接受1,000或10,000次请求时,以前的价格变得经济上不可行。

我也尝试使用Node.js的https服务器终止SSL,性能与Pound,stunnel和stud非常相似,所以没有明显的优势。

所以我希望有人可以帮忙的是build议我如何解决这个荒谬的代价,我们必须吸收以提供SSL连接。 我听说SSL硬件加速器提供了更好的性能,因为硬件devise用于SSLencryption和解密,但是由于我们目前在所有服务器上使用Amazon EC2,使用SSL硬件加速器不是一个select,除非我们有单独的数据以物理服务器为中心。 我只是努力想知道,如果亚马逊,Google,Facebook这样的成本如此之高,可以通过SSL提供所有stream量。 那里一定有更好的解决办法。

任何意见或想法将不胜感激。

谢谢Matt

我不太了解不同EC2实例上可用的CPU功率,但我认为您的问题不在于您select使用TLS终止代理软件,而是使用它们的configuration。 没有任何configuration,我假设他们都会提供他们支持的所有密码套件,包括(非常)慢的套件。 而且他们可能会让客户挑选最喜欢的那个。

并不是所有的TLS密码套件都是天生的,有的比其他的有更高的CPU成本,不pipe是密钥交换还是密码本身。 根据所使用的软件,应该有一种方法来指定服务器接受的一串密码(也是一种使服务器坚持的方法)。 对于OpenSSL,这些工作如下: http : //www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS

如果要提高速度,至less要确保不使用采用Diffie-Hellmann(非椭圆曲线种类)密钥交换的密码。 要使用DH密钥交换禁用密码套件,请确保该string包含!DH 。 您可以testing哪些string导致哪些密码可用,例如openssl ciphers -v 'HIGH:!aNULL:!DH:!ECDH'

该string同时禁用正常的Diffie-Hellman和Elliptic Curve Diffie-Hellmann密钥交换。 这可能只会留下RSA密钥交换,具体取决于您的OpenSSL版本。

关于密码,你应该testing你的EC2硬件。 如果没有硬件加速, 至less根据这个基准 ,你可能更喜欢RC4比AES128更优于AES256。

我还build议阅读这篇精彩的文章 ,特别是启发性的第一张图,显示DH对TLS握手性能的影响。

最后,确保您使用的是TLS会话caching。 这也节省了一些CPU。

我刚刚意识到亚马逊的Elastic Load Balancer对于SSLterminal来说是超级慢的…我在1分钟内用1到250个并发连接对www.blitz.io(没有关系,只是一个客户)做了一个简单的testing。 它失败了可怕…但是,如果我在ELB的前端执行TCP 443,在后端执行没有证书的TCP 443,则在运行IIS和该实例的SSL证书时,会清除一个小型实例的CPU。 我只需要握手,这是一个简单的Web服务,为来自全国各地的客户提供服务。 新的连接设置和拆卸每次。

我如何devise一个高stream量的SSL Web服务,最好是使用SSL一直到后端,以实现严格的安全合规性?

Node.js的https服务器与Pound,stunnel和stud非常相似,这种方法没有明显的优势。

我也想知道如何有效地做到这一点。 AWS的SSL终止速度非常慢,但也许有一些方法来提高其性能。 梭哈似乎很有前途,但正如你所说,也有一个很大的CPU成本。