e-works数字化企业网  »  文章频道  »  基础信息化  »  终端和服务器

HTTPS测试服务器搭建及性能探究

2017/10/4    来源:简书    作者:佚名      
关键字:HTTPS  服务器  
本文主要是在测试https服务时对搭建https服务器的一些实践总结。TLS协议的介绍部分来源于对RFC5246的理解,不当之处,还请指出。后面包含一段对https的性能分析的工程实践。
    1 TLS协议简介
 
    1.1 简介
 
    TSL是传输层安全协议(Transport Secure Protocol)的简称,它的前身是SSL(Secure Sockets Layer)。TLS的设计目标是为互联网通信提供安全保证,防止数据被窃听,篡改。TLS协议由记录层(TLS Record Layer)和握手层(TLS Handshake Layer)组成,记录层处于协议的最低层,为TLS协议提供安全可靠的连接。TLS在协议栈中处于HTTP和TCP协议之间,但是TLS协议是独立于应用层协议的,也就是说高层的应用层协议,如HTTP,FTP等都可以创建在TLS之上,TLS的下层可以是任何可靠传输层协议,如TCP,SPX等。
 
    1.2 TLS的版本演进
 
1.2 TLS的版本演进
 
    TLS目前已发布的最新版本是TLS1.2,它在RFC5246中定义,其前身SSL1.0,SSL2.0和SSL3.0。SSL由于安全漏洞,已逐渐在被淘汰;TLS1.0和SSL3.0差异很小,几乎等同,渐渐也不再使用,所以现在的话,只要注意TLS1.1以上的版本。
 
    1.3 TLS握手过程
 
    TLS分为记录层协议和握手层协议:
 
    记录层协议(TLS Record Protocol):
 
    记录层协议负责将要发出的消息进行分片,压缩,打上消息认证码(MAC)并最终交到传输层;或将接收到的数据进行解压,解密,数据校验,重新 组装后传到上一层。
 
    握手层协议(TLS Handshake Protocol):
 
    握手层协议处于记录层协议之上,握手层协议的作用是在真正的应用数据传输之前,使客户端和服务器互相进行身份认证,协商加密算法以及生成加密密钥。握手层用于协商出记录层的参数。这些参数将会被记录层用于双方的身份认证,实例化协商的安全参数,错误报告。
 
    TLS在协议栈中的位置:
 
1.2 TLS的版本演进
 
    TLS的协议栈位置TLS的握手过程:
 
    1.客户端发送ClientHello消息,包含可选密码组件,一个客户端生成的随机数等,服务端接收后回一个ServerHello消息给客户端,确定密码方案,并生成一个服务器随机数,发给客户端。
 
    这一步的数据传输在TCP上进行,数据都是公开的,中间人攻击者可以很轻松的得到这些数据。
 
    2.服务器发送证书,服务器的身份确认成功后;服务器可能会请求一个客户端证书,要求客户端进行身份认证,客户端给服务器发出证书,验明身份。这一步不是必须的。
 
    3.客户端向服务器发出摘要认证,确认接收的消息的完整性,保证没有被第三方篡改。
 
    4.双方交换必需的加密参数。其中包括一个预主密钥,客户端会用服务器证书中的公钥将这个密钥加密传给服务器,服务器使用私钥进行解密。
 
    5.客户端生成一个预主密钥,并使用服务器证书中的公钥加密,服务器解密后生成一个主密钥。双方使用这个主密钥(master secret)对应用层数据进行对称加密(如AES256)。 主密钥是客户端和服务器共享的。
 
    6.最后,把这些准备好的的安全参数交给记录层协议。
 
    下图转自维基百科TLS词条 https://zh.wikipedia.org/wiki/%E5%82%B3%E8%BC%B8%E5%B1%A4%E5%AE%89%E5%85%A8%E5%8D%94%E8%AD%B0:
 
1.2 TLS的版本演进
 
    SSL_handshake_with_two_way_authentication_with_certificates.png会话恢复过程:
 
    客户端服务器出于性能的考虑,可能会恢复前面的会话,或复制一个当前存在的会话,而不是重新协商密码参数,建立新的会话(4.2部分使用tcpdump跟踪发现,这个过程确实是耗时占比很大)。
 
    1.客户端发出一个ClientHello消息,这个消息包含要恢复的会话的Session ID。
 
    2.服务接到这个SessionID后,检查它的缓存是否存在该会话ID。如果找到了,服务器将使用该会话状态重建连接,并发一个ServerHello给客户端,其中包含一个和ClientHello消息一模一样的SessionID。
 
    3.此时,协议规定,必须要双方发出ChangeCipherSpec消息,并接着发出Finished消息确认握手完成。然后客户端服务器就可以传输应用层数据了。
 
    4.如果服务器没有在缓存中找到Session ID,那么新的SessionID将会建立,然后又会执行一次完全握手。
 
--------------------------------------------------------------------------------
 
    2 使用nginx搭建https服务器
 
    2.1 环境准备
 
    先搭建nginx,nginx的搭建在官网中可以找到 http://nginx.org/en/docs/install.html
 
    注意如果是用源码编译,有的较老版本构建编译时需要带上参数--with-http_ssl_module,最新的nginx版本是默认有这个编译参数的。
 
    配置:
 

1.2 TLS的版本演进

 
    ssl_certificate : 存放服务器证书的地址,主要用于数字证书的身份认证。所有连到服务器的客户端都能拿到这个证书;
 
    ssl_certificate_key : 是私钥,只能被服务器知道。
 
    ssl_protocols, ssl_ciphers选项是可选的。
 
    2.2 详细操作步骤
 
    下面尝试在本地搭建一个简单的https服务器,在443端口监听。
 
    大致步骤如下:
 
    1.搭建一个nginx服务器;
 
    2.使用openssl生成服务器私钥,客户端私钥,服务器公钥,客户端公钥;
 
    3.生成CA根证书,为服务器证书和客户端证书(可选)提供签名服务;
 
    4.生成服务器证书和客户端证书,并请求CA的签名;
 
    5.在操作系统上信任我们伪造的服务器证书,这里没有为客户端生成证书;
 
    6.随便写一个web服务,提供一个url返回一段静态报文,让nginx为它做一下代理,然后启动这个web服务器;
 
    7.测试。
 
    以下是这些步骤的操作命令:
 
1.2 TLS的版本演进
 
    证书和私钥生成完毕后,开始配置nginx(http部分从略);
 

1.2 TLS的版本演进

 

本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐