一种基于TSL的安全TCP通信实现方法

2019-03-07 05:22文志华周序生
电脑知识与技术 2019年36期

文志华 周序生

摘要:TSL(Transpon Layer Security)协议是重要的互联网标准协议。重点分析了TSL协议握手协议的过程,通过请求公钥与多次协商最终形成会话密钥。描述了证书、私钥的生成方法,实现一个服务端、客户端使用TSL协议传输的方法,并验证TSL安全传输的效果。

关键词:传输层安全传输;TSUSSL; TCP安全通讯信

中图分类号:TP393.08

文献标识码:A

文章编号:1009-3044(2019)36-0040-03

1概述

传输层安全协议(TSL, Transport Layer Security)是如今互联网上应用最广泛的加密方法[1],是重要的互联网标准,其前身为网景公司于提出的安全套协议(SSL, Secure Socket Layer)。在TLS/SSL出现之前,大部分应用层协议(http、ftp、smtp等)存在着网络安全问题。例如,互联网重要的基础协议http协议,在传输过程中使用的是明文信息,传输报文一旦被截获便会泄露传输内容;传输过程中报文如果被篡改,无法轻易发现;无法保证消息交换的对端身份的可靠性。为了解决此类场景下的问题.研究人员提出了在应用层和传輸层之间加入了TLS/SSL协议[2-4]。https协议由此产生,并广泛运用于互联网的安全传输。但是,由此也容易让人误以为类似于https是一种全新的安全协议,然而其本质是包裹于TLS/SSL之上的http协议[5]。因此,基于TSL协议直接实现TCP的安全传输,通过代码分析和还原TSL安全传输的本质是有必要的。

2 TSL原理

TLS协议可以分为两部分:记录协议(ReCord ProtoCol)和握手协议(Handshake Protocol)。记录协议通过使用客户端和服务端协商后的秘钥进行数据加密传输。握手协议客户端和服务端进行协商,确定一组用于数据传输加密的密钥串[6]。在握手协议阶段的基本过程是:1)客户端向服务器端索要并验证公钥;2)双方协商生成“对话密钥”。

TSL的关键在握手协议阶段,握手协议完成之时就已经构建了基于“对话密钥”的安全传输基础。握手阶段的过程及原理分为6个步骤[7]:

第一步客户端发起请求:客户端给出协议版本号、一个自动生成的随机数(Client random),以及客户端支持的加密方法。第二步服务端回应:服务端确认双方使用的加密方法,并给出数字证书以及一个服务端生成的随机数(Server random)。第三步证书校验及客户端请求:客户端确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给服务端。第四步服务端解密:服务端使用自己的私钥,获取客户端发来的随机数(即Premaster se-eret)。第五步对话密钥生成:客户端和服务端根据约定的加密方法,使用前面的三个随机数,生成”对话密钥”(session key),用来加密接下来的整个对话过程。第六步握手结束:客户端计算所有接收信息的hash值,并采用协商密钥解密encrypt-ed_handshake_message,验证服务器发送的数据和密钥,验证通过则握手完成。

3基于TSL的安全TCP传输实现

3.1密钥及证书的生成

在TSL的握手阶段,至少需要一个证书及密钥,才能完成握手生成一个安全的对话密钥。OpenSSL是一个开放源代码的软件库包,能通用于主流操作系统。利用OpenSSL,可以生成服务端密钥及证书[8]。

(1)OpenSSL安装

下并安装好之后,需要用openssl version在命令行查看当前版本,验证是否安装成功。如果安装成功,需要配置OpenS-SL的两个环境变量信息,在命令行中输入:set RANDFILE=D:\OpenSSL-Win64V rnd和set OPENSSL_CONF=D: \OpenSSL-Win64\bin\cnflopenssl.enf'。其中“D:\OpenSSL-Win64”是OpenS-SL的安装目录,“openssl.enf'”是OpenSSL的配置信息。

(2)生成私钥

使用命令openssl genrsa -des3 -out privatekey.pem 2048生成一个2048位的RSA密钥privatekey.pem,同时需要输入一个des3加密的密码,如果不想每次输入密码,则可以使用命令openssl genrsa -out privatekey.pem 2048生成一个无密的2048位密钥。如果需要生成安全的密钥,可以将2048更改为4096或更长。

(3)生成公钥

利用上一步中生成的私钥文件privatekey.pem,使用命令openssl req -new -keyprivatekey.pem -out cert.csr生成cert.csr证书请求文件。在互联网环境中,需要用cert.csr证书请求文件去数字证书颁发机构(即CA)申请一个正式的数字证书。为了便于测试,使用命令openssl req -new -x509 -key privatekey.pem -out cert.crt -days 365生成一个申请机构和颁发机构都是自身的测试数字证书cert.crt。

数字证书生成中需要输入的一些信息说明:Country Name(2 letter code) [AU]:CN ISO国家代码(只支持两位字符)State or Province Name (full name) [Some-State]:ZJ所在省份Locality Name (eg, city) []:HZ所在城市Organization Name (eg, company):SW_TECH公司名称Organizational Unit Name (eg,section) []:SW_TECH组织名称Common Name (eg,YOUR name) []:127.0.0.1申请证书的域名(为了测试方便,此处使用本机回环地址)Email Address []:admin@aclmin.com管理员邮箱

(4)清除私钥密码

将加密的RSA密钥转成未加密的RSA密钥,避免每次读取都要求输入解密密码。使用命令openssl rsa -in privatekey.pem-out privatekey.pem.un

用私钥privatekey.pem.un和公钥cert.crt证书文件,在程序中使用并开发一个加密通讯的服务器。

3.2安全服务端实现

在安全服务端,需要传人私钥privatekey.pem.un和公钥cert.ert证书文件。私钥文件需要谨慎保存,一旦文件泄露或被第三方获取内容,在密钥过期之前第三方能一直冒充服务端欺骗客户端连接。服务端部分实现代码(基于Python,客户端相同1:

def tsl_server(address):

context = ssl. create_default_context(ssl. Purpose. CLI-ENT_AUTH)

context. load_cert_chain(certfile= "cert. crt", keyfile= "pri-vatekey.pem.un")

listener =

socket. socket(socket. AF_INET,

socket.SOCK_STREAM)

listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSE-ADDR,11

lis,tener.bincl(address)

listener.listen(l)

print('Listening at interface {!r) and port(".format(*address》

raw_sock, address= listener.accept0

print('Connection from host {!r) and port {}'.format(*address》

ssl_sock= context.wrap_socket(raw_sock, server_side=True)

ssl_sock.sendall('My name is TSLServer.'.encode('ascii'》

ssl_sock.close0

3.3客戶端实现

客户端需要公钥证书cert.crt文件,不需要服务端私钥。在测试时,需要提供与证书生成时对应的common name项对应的正确域名,本次测试使用127.0.0.1,在互联网环境中需要使用正确的域名。部分客户端代码:

def tsl_cleint(address):

cafile= "{:ert.crt"

host, port= address

purpose= ssl.Purpose.SERVER_AUTH

context= ssl.create_default_context(purpose, caf/le=caf/le)

raw_sock = socket. socket(socket. AF_INET, socket.SOCK_STREAM)

raw_sock.connect《host, port》

print('Connected to host(!r} and port {".format(host, port》

4测试与结论

4.1测试

启动服务端,同时启动RawCap抓包工具,运行客户端程序对服务端发送请求并获得服务端的返回数据。对本地ip抓包捕获9000端口内容,与没有采用TSL安全传输进行对比;对TSL握手阶段不同阶段的抓包内容进行对比。

对比图1和图2中内容,在没有采用TLS协议的TCP通信中,传输的是明文内容;使用了TSL协议之后,捕获的TCP传输内容不再可见,是加密的内容。

对比图3和图4中的内容,得知TSL握手协议的前面三次会话是采用的明文传输,所以服务端发送给客户端的证书也是明文传输的;直到会话密钥产生后的传输内容才采用密文传输。

4.2结论

在典型的TSL通信场景中,客户端向服务器索取证书,证书被信任机构签名生效,且包含一个公钥。客户端对证书中声明的身份进行第三方验证,确认其安全匹配。客户端与服务器就加密算法、压缩以及密钥等设定进行协商,最后使用协商结果的方案对套接字上双向传输的数据进行安全保护。

通过测试对比,采用TSL协议后的TCP传输内容为密文,对传输数据起到了明显的安全保护,进步改进TCP服务端,可以在此基础上构建出完整安全的TCP服务器。

参考文献:

[1]古尔利(David Gourley)等.HTTP权威指南[M].北京:人民邮电出版社,2012.

[2] RESCORLA E.The Transport Layer Security (TLS) ProtocolVersion l.3 - draft - ietf - tls - tls13 - 10[DB/OL].[2018 - 03 -30].https://tools.ietf.org/html/draft - ietf - tlstls13 - 10 (2015).

[3] RESCORLA E.rlhe Transport Layer Security (TLS) Protocol Ver-sion l.3 - draft - ietf - tls - tls13 - 13[DB/OL].[2018 - 03 -30].https://tools.ietf.org/htmUdraft - ietf - tlstls13 - 13 (2016).

[4] RESCORLA E.'rhe Transport Layer Security (TLS) Protocol Ver-sion l.3 - draft - ietf - tls - tls13 - 18[DB/OL].[2018 - 03 -30].https://tools.ietf.org/html/draft - ietf - tlstls13 - 18 (2016).

[5]闫露,邓浩,江陈晓.TLS协议现状与研究综述[J].网络新媒体技术,2019,8(01):1-8.

[6]百度百科.TSL[EB/OL].https://baike. baidu. com/item/TLS/2979545.

[7]张兴隆,程庆丰,马建峰.TLS l.3协议研究进展[J].武汉大学学报:理学版,2018,64(06):471-484.

[8]简书.OpenSSL下载安装[EB/OL].htfps://www.jianshu.c om/p/12aldc4ah7aO

【通联编辑:代影】

收稿日期:2019-11-11

基金项目:湖南省教育厅科学研究规划课题(编号:17C0477)作者简介:文志华(1982-),男,湖南桃江人,讲师,硕士,主要研究方向为网络安全、智能医疗信息处理;周序生,副教授,硕士,主要

研究方向为网络安全、大数据处理。