经济高效地终止大量SSL连接

时间:2012-01-30 16:43:02

标签: node.js ssl openssl haproxy stunnel

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

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

所以我研究了许多解决方案,如Pound,stunnel和stud,所有这些解决方案都允许终止443上的传入连接,然后传递到端口80上的HAProxy,然后将连接传递到Web服务器上。然而不幸的是,我发现在c1.medium(高CPU)实例上向SSL终止代理服务器发送流量非常快速地消耗了所有CPU资源,并且仅以每秒50个左右的请求速率消耗。我尝试使用上面列出的所有三个解决方案,并且所有这些解决方案的表现大致相同,我认为它们都依赖于OpenSSL。我尝试使用64位非常大的高CPU实例(c1.xlarge),发现性能只能随成本线性增长。因此,基于EC2定价,我需要为每秒200个SSL请求支付大约600美元/手,而不是每秒2,000个非SSL请求60美元/米。当我们开始计划每秒接受1,000或10,000个请求时,前一个价格在很快就变得经济上不可行。

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

所以我希望有人可以提供帮助,建议我如何解决这个荒谬的成本,我们必须吸收这些成本以提供SSL连接。我听说SSL硬件加速器提供了更好的性能,因为硬件设计用于SSL加密和解密,但由于我们目前正在为所有服务器使用Amazon EC2,因此除非我们有单独的数据,否则不能使用SSL硬件加速器以物理服务器为中心。我只是在努力想知道亚马逊,谷歌,Facebook等公司如何能够通过SSL提供所有流量,而这个成本是如此之高。那里必须有更好的解决方案。

非常感谢任何建议或想法。

由于 马特

4 个答案:

答案 0 :(得分:5)

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

并非所有TLS密码套件都是相同的,有些套件的CPU成本高于其他密码套件,无论是密钥交换机还是密码本身。 根据所使用的软件,应该有一种方法来指定服务器接受的密码字符串(以及使服务器坚持的方法)。对于OpenSSL,这些工作方式如下:http://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS

如果你想要速度,至少要确保你没有使用采用Diffie-Hellmann(非椭圆曲线类型)密钥交换的密码。 要使用DH密钥交换禁用密码套件,请确保字符串在某些时候包含!DH。 您可以测试哪些字符串可以使用哪些密码,例如openssl ciphers -v 'HIGH:!aNULL:!DH:!ECDH'

此字符串禁用正常的Diffie-Hellman以及Elliptic Curve Diffie-Hellmann密钥交换。这可能只会留下RSA密钥交换,具体取决于您的OpenSSL版本。

关于密码,您应该测试您想要的EC2硬件。如果没有硬件加速,你可能更喜欢RC4而非AES128优于AES256而不是at least according to this benchmark

我还建议阅读this wonderful post,尤其是启示性的第一个图表,显示DH对TLS握手性能的影响。

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

答案 1 :(得分:1)

我刚刚意识到亚马逊的Elastic Load Balancer对于SSL终端来说速度非常慢......我在www.blitz.io(没有关系,只是一个客户)上做了一个简单的测试,在1分钟内完成了1到250个并发连接。它失败了......但是如果我在ELB的前端执行TCP 443而在后端没有证书的TCP 443,它会在运行IIS和该实例上的SSL证书时清除一个小实例的CPU。我需要握手,这是一个简单的网络服务,为来自各地的客户提供服务。每次都有新的连接设置和拆解。

如何设计高流量的SSL网络服务,最好使用SSL一直到后端以实现严格的安全合规性?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我也想知道如何有效地做到这一点。 AWS ssl终止速度非常慢,但也许有一些方法可以改善其性能。梭哈似乎很有希望,但就像你提到的,也有很大的CPU成本。

相关问题