一种利用请求/数据聚合提高WebServer的https应用性能的方法与流程

文档序号:11778424阅读:542来源:国知局
一种利用请求/数据聚合提高WebServer的https应用性能的方法与流程

本发明涉及信息安全技术领域,尤其涉及一种利用请求/数据聚合提高webserver的https应用性能的方法。



背景技术:

为了保护敏感数据在传送过程中的安全,越来越多的政府、企业、银行开始部署基于ssl的https通信。安全套接层协议ssl(securesocketlayer)是使用公钥和私钥技术组合的安全网络通讯协议。ssl协议是netscape推出的基于web应用的安全协议,ssl协议指定了一种在应用程序协议(如http、telenet、nmtp和ftp等)和tcp/ip协议之间提供数据安全性分层的机制,它为tcp/ip连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,使客户端/服务器应用之间的通信不被攻击者窃听,确保数据在传送中不被改变,即确保数据的完整性。

openssl是一个开源代码的安全项目,目标是用强大的加密算法来实现安全的socket层(securesocketslayer,sslv2/v3)和传输层的安全性(transportlayersecurity,tlsvl)。它包含了完整的加密算法,数字签名算法及证书签名算法等。可以很好的保证数据的完整性、保密性和正确性。

目前基于webserver领域的硬件加/解密系统的设计分为五个层次:webserver应用层,openssl层,cryptodev层,硬件加/解密驱动层,以及硬件加/解密引擎层。如图1所示,其中webserver应用层和openssl层工作在用户空间。webserver自身采用多线程方式维持系统负载均衡,监听用户的连接请求,并对客户端的请求做出响应。在处理客户端请求过程中,webserver需要通过openssl提供的加/解密功能,完成用户的身份认证和安全检查等功能。启用https传输之后,webserver将需要传输的数据通过openssl进行ssl数据处理后再传输给客户端。openssl将加/解密请求和信息摘要请求发送给cryptodev。cryptodev层和硬件驱动层工作在内核空间。cryptodev将openssl层下发的请求转换为硬件加/解密驱动识别的请求发送给硬件加/解密驱动。硬件加/解密驱动将请求构造成硬件加/解密引擎能够识别的数据结构,并将其填写到硬件加/解密引擎的请求队列中。当硬件加/解密引擎完成加/解密或信息摘要操作后产生中断,异步返回结果。

openssl向上响应上层web应用提交的各种加/解密、信息摘要请求,向下通过与硬件驱动交互,实现硬件加/解密引擎的调用和结果返回。

上层web应用将加/解密请求下发给openssl,openssl对原始数据进行ssl数据处理后,将加/解密请求下发给硬件,从而调用硬件加/解密引擎实现加/解密运算。若openssl接收到的上层加/解密请求中,原始数据大小超过ssl记录层最大源数据长度时,openssl将以ssl最大源数据长度为单位将原始数据分割成多个数据块(最后一个数据块可能小于ssl最大源数据长度),然后使用同步方式依次对每一个数据块进行压缩、mac值计算以及封装处理,再将处理后的数据块下发到硬件驱动,调用硬件加密引擎进行相应的加/解密运算。

openssl层分割及封装后的每一个数据块,通过调用硬件实现加/解密操作都会涉及到内核态与用户态切换开销(modeswitch)和上下文切换开销(contextswitch)。包括以下切换开销:

1)用户态进程通过ioctl接口传递原始数据到内核驱动,ioctl(ctx->cfd,cioccrypt,&cryp),产生一次modeswitch;

2)内核提交请求给驱动之后,通过waitfor()等待驱动执行完成,此时用户进程进入sleep状态,内核调度另外一个进程运行,产生一次contextswitch;

3)硬件异步执行加解密请求,执行完成之后产生中断,中断处理会产生一次contextswitch;

4)中断处理完成之后,通过complete()函数通知用户进程该请求已经执行完成,内核会唤醒sleep状态的用户进程来完成后面的工作,这里产生一次contextswitch;

5)用户态进程提交的请求得到结果返回用户态,产生一次modeswitch。

一个原始数据大小为n×ssl最大源数据长度的加解密请求,需要将其拆分为n个ssl最大源数据长度的数据块进行加密,每个数据块在运算过程中都会产生两次内核态与用户态切换开销(modeswitch)和上下文切换开销(contextswitch),则传统技术方案存在如下缺陷:

上层webserver下发给openssl的加密请求需要多次调用硬件引擎来完成加密操作,使得https加密过程中产生大量硬件的模式切换开销和上下文切换开销,降低了webserver的https应用性能,造成硬件加密引擎的利用率下降。



技术实现要素:

有鉴于此,本发明提供了一种利用请求/数据聚合提高webserver的https应用性能的方法,解决https加密过程中因多次调用硬件引擎完成加密操作而造成大量硬件切换开销的问题。

本发明提供了如下方案:

一种利用请求聚合提高webserver的https应用性能的方法,该方法包括:将上层webserver应用的多个加密请求进行请求聚合后,一次性下发给下层openssl进行ssl数据处理,通过调用一次硬件加密引擎,完成多个请求加密操作。

一种利用数据聚合提高webserver的https应用性能的方法,该方法包括:对于单个数据长度超过ssl源数据长度要求的加密请求,在openssl层经过ssl数据处理后,对数据块进行数据聚合,通过调用一次硬件加密引擎,完成多个数据块加密操作。

进一步地,所述请求聚合的方法包括以下操作:

a)对上层web应用接收到的每个加密请求,根据协商的加密算法,进行ssl数据处理预操作;

b)将经过ssl数据处理预操作后的多个请求进行聚合成为一个聚合加密请求,一次性下发给下层openssl进行ssl数据处理。

进一步地,所述ssl数据处理预操作具体为:

a)对数据长度不超过ssl源数据长度的加密请求,根据协商的加密算法,为ssl数据处理过程中的mac值计算、字节填充操作预留出相应的数据存储空间;

b)对数据长度超过ssl源数据长度的加密请求,按照ssl源数据长度大小进行分段;根据协商的加密算法,对每段数据ssl数据处理过程中的mac值计算、字节填充操作预留出相应的数据存储空间;将经过上述空间预留操作后的数据段进行聚合。

进一步地,所述协商的加密算法在ssl数据处理过程中的mac值计算、字节填充操作所需的数据存储空间为加密算法中设定的固定字节长度。

进一步地,所述数据聚合的方法包括以下操作:

a)修改webserver应用程序相关配置文件,使得webserver应用程序可处理的ssl数据长度为n×ssl源数据长度;

b)修改实现ssl数据写操作功能的函数,使得传递到ssl数据处理函数的数据长度为n×ssl源数据长度;

c)修改写数据buffer的空间大小,支持聚合后的数据存储;

d)修改实现ssl数据处理功能的函数,按照ssl数据处理流程,对n段ssl源数据长度数据进行压缩、mac值计算、添加mac值、字节填充操作,再将这n段处理后的数据块进行聚合;

e)通过evp封装的加密接口,将聚合后的n×ssl源数据长度数据一次下发给硬件进行数据加密操作;

f)将加密后的数据拆分成n段,并在每段数据前添加头部信息,通过ssl数据发送接口逐个发送n个tcp数据包。

由此可见,本发明提供的一种利用请求/数据聚合提高webserver的https应用性能的方法,通过将上层webserver应用的多个加密请求进行请求聚合,对在openssl层经过ssl数据处理后的数据块进行数据聚合,通过调用一次硬件加密引擎,完成多个数据加密操作,减少了https加密过程中调用硬件的模式切换开销和上下文切换开销,提升了webserver的https应用性能,进而提高了硬件加密引擎的利用率。

附图说明

图1基于webserver领域的加/解密硬件加速系统;

图2为本发明实施例nginx服务器应用的请求数据处理函数调用的流程图;

图3为未使用本发明技术方案时对原始数据进行ssl数据处理的流程图;

图4为本发明实施例中使用本发明技术方案时对原始数据进行数据聚合的流程图;

图5为本发明实施例中使用本发明技术方案时对原始数据进行请求聚合的流程图。

具体实施方式

为使本技术领域的人员对本发明的目的、技术方案和优点理解更加清楚,下面将结合附图和实施例对本发明实施方式做进一步的描述,该实施例不构成对本发明实施例的限定。

实施例:

本发明实施例以nginx服务器应用为例来说明如何利用请求/数据聚合提高webserver的https应用性能。

首先,以nginx为例,分析上层webserver应用是如何通过openssl对请求的原始数据进行ssl数据处理的。

如图2所示,在nginx发送数据时,会调用ngx_output_chain()函数发送缓存的https数据链,该函数会进一步调用ngx_ssl_send_chain()函数来发送数据。而ngx_ssl_send_chain()函数会调用ngx_ssl_write()函数使用openssl库中相关接口来对原始数据进行ssl数据加密和校验处理并将处理后的密文数据发送到客户端。

ngx_ssl_send_chain()函数会对发送的数据块大小进行相关的控制处理,具体如下:

其中size用于控制传递到ngx_ssl_write()函数中待进行ssl数据处理的数据大小。c->ssl->buffer_size在函数ngx_ssl_create(ngx_ssl_t*ssl,ngx_uint_tprotocols,void*data)中被赋值:ssl->buffer_size=ngx_ssl_bufsize。

ngx_ssl_bufsize可以通过修改nginx.cfg中的配置参数ssl_buffer_size来设定,可以使得nginx传递到ssl3_write_byte()函数的数据块大小增加到n×2^14字节。

但是当数据传输到do_ssl3_write()函数后,数据块的大小会再次受到限制,使得实际进行ssl数据处理的数据大小不超过2^14字节,具体如下:

do_ssl3_write()函数会对原始数据进行ssl数据处理(压缩、mac计算、加密等操作),并将封装好的tcp数据包发送给客户端。下面将以ecdhe-rsa-aes256-sha384加密套件为例对do_ssl3_write()函数的详细过程进行分析,如图3所示,一个n×2^14字节的数据请求,需要分割为n个2^14字节大小的数据块,每个数据块都需要进行ssl数据处理操作。

do_ssl3_write()函数中具体ssl数据处理过程如下:

1)将ssl3_write_byte()函数传递过来的原始数据进行memcpy到特定的地址中;

2)对原始数据进行mac值计算,并将mac结果添加到原始数据的后面;

3)调用rand_bytes()函数在原始数据前面添加explicitiv,并对explicitiv、原始数据、mac整体进行pading字节填充操作;

4)将上述处理后的数据块下发给硬件驱动,并调用硬件加密引擎进行加密计算;

5)再加密后的密文数据块前面添加tcp头部信息;

6)调用ssl3_write_pending()函数发送tcp数据包。

这n个数据块要依次串行完成上述操作,对下一个数据块的操作需要等待上一个数据块的所有操作完成才能开始,并且对每个2^14字节数据块都需要两次的模式切换开销和上下文切换开销。

为减少硬件加密过程中不必要的开销,本发明提供了一种利用请求/数据聚合提高webserver的https应用性能的方法,以减少调用硬件的模式切换开销和上下文切换开销,提高了硬件加密引擎的利用率。

本发明涉及到的数据聚合处理具体实现包括:

1)修改nginx服务器应用相关配置文件nginx.cfg,使得传递到ngx_ssl_write()函数的数据长度为n×2^14字节;

2)修改ssl3_write_byte()函数,使得传递到do_ssl3_write()函数的数据长度为n×2^14字节;

3)修改do_ssl3_write()函数,按照ssl数据处理流程,对n段2^14字节数据进行压缩、mac值计算、添加mac值、字节填充操作,再将这n段处理后的数据块进行聚合;

4)修改写数据buffer的空间大小,支持聚合后的数据存储;

5)调用evp_cipher()加密函数,将聚合后的n×2^14字节数据一次下发给硬件进行数据加密操作;

6)将加密后的数据分成n段,并在每段数据前添加tcp头部信息;

7)通过调用ssl3_write_pending()函数逐个发送n个tcp数据包。

基于以上说明,本发明将openssl向硬件发送的加密数据块进行数据聚合。如图4所示,本发明对n个数据块进行mac值计算,添加explicitiv和pading字节填充,然后将经过上述处理的n个数据块聚合后一次性下发给下层硬件驱动,调用一次硬件引擎来同时完成n个数据块的加密计算。通过这样的数据聚合处理后,调用硬件时的模式切换开销和上下文切换开销减少到原来的1/n,硬件加密引擎的利用率也得到了提高。

本发明涉及到的请求聚合处理具体实现包括:

1)创建一个结构体用来存放请求聚合时每个请求对应的session信息;

2)对nginx接收到的每个加密请求,根据协商的加密算法,进行ssl数据处理预操作。下面以ecdhe-rsa-aes256-sha384加密套件,具体操作包括:

a)对数据长度不超过2^14字节的加密请求,根据协商的加密算法,为ssl数据处理过程中的添加explicitiv预留出16字节存储空间、mac值计算预留出48字节存储空间,同时为字节填充操作预留出相应的数据存储空间;

b)对数据长度超过ssl源数据长度的加密请求,按照2^14字节大小进行分段;根据协商的加密算法,对每段数据ssl数据处理过程中的添加explicitiv预留出16字节存储空间、mac值计算预留出48字节存储空间,同时为字节填充操作预留出相应的数据存储空间;

3)将经过上述ssl数据处理预操作后的多个请求聚合成为一个聚合加密请求,一次性下发给下层openssl进行ssl数据处理。具体包括:

a)对多个请求的分片数据分别进行mac值计算,并将mac值填充到预留的对应空间;

b)为每个数据块在对应的预留空间添加explicitiv;

c)根据协商的加密算法中规定的加密数据长度要求,对每个数据块进行字节填充到对应的预留空间。

4)将经过ssl数据处理的聚合加密请求一次性下发给底层硬件加密引擎来完成加密操作;

5)对加密后的聚合请求数据进行分片,根据之前创建的session结构体中每个请求与session的对应信息,为每一个分片添加头部信息,通过ssl数据发送接口逐个发送tcp数据包给对应的客户端。

基于以上说明,本发明将上层webserver应用向openssl发送的加密数据请求进行请求聚合。如图5所示,本发明对n个加密请求聚合后一次性下发给openssl,对多个数据块进行mac值计算,添加explicitiv和pading字节填充,然后调用一次硬件引擎来同时完成n个加密请求数据块的加密计算。通过这样的请求聚合处理后,减少了https加密过程中调用硬件的模式切换开销和上下文切换开销,提升了webserver的https应用性能,进而提高了硬件加密引擎的利用率。

以上所述实施例并不用以限制本发明,凡在本发明的原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1