文志華 周序生
摘要:TSL(Transpon Layer Security)協(xié)議是重要的互聯(lián)網(wǎng)標準協(xié)議。重點分析了TSL協(xié)議握手協(xié)議的過程,通過請求公鑰與多次協(xié)商最終形成會話密鑰。描述了證書、私鑰的生成方法,實現(xiàn)一個服務(wù)端、客戶端使用TSL協(xié)議傳輸?shù)姆椒?,并驗證TSL安全傳輸?shù)男Ч?/p>
關(guān)鍵詞:傳輸層安全傳輸;TSUSSL; TCP安全通訊信
中圖分類號:TP393.08
文獻標識碼:A
文章編號:1009-3044(2019)36-0040-03
1概述
傳輸層安全協(xié)議(TSL, Transport Layer Security)是如今互聯(lián)網(wǎng)上應(yīng)用最廣泛的加密方法[1],是重要的互聯(lián)網(wǎng)標準,其前身為網(wǎng)景公司于提出的安全套協(xié)議(SSL, Secure Socket Layer)。在TLS/SSL出現(xiàn)之前,大部分應(yīng)用層協(xié)議(http、ftp、smtp等)存在著網(wǎng)絡(luò)安全問題。例如,互聯(lián)網(wǎng)重要的基礎(chǔ)協(xié)議http協(xié)議,在傳輸過程中使用的是明文信息,傳輸報文一旦被截獲便會泄露傳輸內(nèi)容;傳輸過程中報文如果被篡改,無法輕易發(fā)現(xiàn);無法保證消息交換的對端身份的可靠性。為了解決此類場景下的問題.研究人員提出了在應(yīng)用層和傳輸層之間加入了TLS/SSL協(xié)議[2-4]。https協(xié)議由此產(chǎn)生,并廣泛運用于互聯(lián)網(wǎng)的安全傳輸。但是,由此也容易讓人誤以為類似于https是一種全新的安全協(xié)議,然而其本質(zhì)是包裹于TLS/SSL之上的http協(xié)議[5]。因此,基于TSL協(xié)議直接實現(xiàn)TCP的安全傳輸,通過代碼分析和還原TSL安全傳輸?shù)谋举|(zhì)是有必要的。
2 TSL原理
TLS協(xié)議可以分為兩部分:記錄協(xié)議(ReCord ProtoCol)和握手協(xié)議(Handshake Protocol)。記錄協(xié)議通過使用客戶端和服務(wù)端協(xié)商后的秘鑰進行數(shù)據(jù)加密傳輸。握手協(xié)議客戶端和服務(wù)端進行協(xié)商,確定一組用于數(shù)據(jù)傳輸加密的密鑰串[6]。在握手協(xié)議階段的基本過程是:1)客戶端向服務(wù)器端索要并驗證公鑰;2)雙方協(xié)商生成“對話密鑰”。
TSL的關(guān)鍵在握手協(xié)議階段,握手協(xié)議完成之時就已經(jīng)構(gòu)建了基于“對話密鑰”的安全傳輸基礎(chǔ)。握手階段的過程及原理分為6個步驟[7]:
第一步客戶端發(fā)起請求:客戶端給出協(xié)議版本號、一個自動生成的隨機數(shù)(Client random),以及客戶端支持的加密方法。第二步服務(wù)端回應(yīng):服務(wù)端確認雙方使用的加密方法,并給出數(shù)字證書以及一個服務(wù)端生成的隨機數(shù)(Server random)。第三步證書校驗及客戶端請求:客戶端確認數(shù)字證書有效,然后生成一個新的隨機數(shù)(Premaster secret),并使用數(shù)字證書中的公鑰,加密這個隨機數(shù),發(fā)給服務(wù)端。第四步服務(wù)端解密:服務(wù)端使用自己的私鑰,獲取客戶端發(fā)來的隨機數(shù)(即Premaster se-eret)。第五步對話密鑰生成:客戶端和服務(wù)端根據(jù)約定的加密方法,使用前面的三個隨機數(shù),生成”對話密鑰”(session key),用來加密接下來的整個對話過程。第六步握手結(jié)束:客戶端計算所有接收信息的hash值,并采用協(xié)商密鑰解密encrypt-ed_handshake_message,驗證服務(wù)器發(fā)送的數(shù)據(jù)和密鑰,驗證通過則握手完成。
3基于TSL的安全TCP傳輸實現(xiàn)
3.1密鑰及證書的生成
在TSL的握手階段,至少需要一個證書及密鑰,才能完成握手生成一個安全的對話密鑰。OpenSSL是一個開放源代碼的軟件庫包,能通用于主流操作系統(tǒng)。利用OpenSSL,可以生成服務(wù)端密鑰及證書[8]。
(1)OpenSSL安裝
下并安裝好之后,需要用openssl version在命令行查看當前版本,驗證是否安裝成功。如果安裝成功,需要配置OpenS-SL的兩個環(huán)境變量信息,在命令行中輸入: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證書請求文件。在互聯(lián)網(wǎng)環(huán)境中,需要用cert.csr證書請求文件去數(shù)字證書頒發(fā)機構(gòu)(即CA)申請一個正式的數(shù)字證書。為了便于測試,使用命令openssl req -new -x509 -key privatekey.pem -out cert.crt -days 365生成一個申請機構(gòu)和頒發(fā)機構(gòu)都是自身的測試數(shù)字證書cert.crt。
數(shù)字證書生成中需要輸入的一些信息說明: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申請證書的域名(為了測試方便,此處使用本機回環(huán)地址)Email Address []:admin@aclmin.com管理員郵箱
(4)清除私鑰密碼
將加密的RSA密鑰轉(zhuǎn)成未加密的RSA密鑰,避免每次讀取都要求輸入解密密碼。使用命令openssl rsa -in privatekey.pem-out privatekey.pem.un
用私鑰privatekey.pem.un和公鑰cert.crt證書文件,在程序中使用并開發(fā)一個加密通訊的服務(wù)器。
3.2安全服務(wù)端實現(xiàn)
在安全服務(wù)端,需要傳人私鑰privatekey.pem.un和公鑰cert.ert證書文件。私鑰文件需要謹慎保存,一旦文件泄露或被第三方獲取內(nèi)容,在密鑰過期之前第三方能一直冒充服務(wù)端欺騙客戶端連接。服務(wù)端部分實現(xiàn)代碼(基于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客戶端實現(xiàn)
客戶端需要公鑰證書cert.crt文件,不需要服務(wù)端私鑰。在測試時,需要提供與證書生成時對應(yīng)的common name項對應(yīng)的正確域名,本次測試使用127.0.0.1,在互聯(lián)網(wǎng)環(huán)境中需要使用正確的域名。部分客戶端代碼:
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測試與結(jié)論
4.1測試
啟動服務(wù)端,同時啟動RawCap抓包工具,運行客戶端程序?qū)Ψ?wù)端發(fā)送請求并獲得服務(wù)端的返回數(shù)據(jù)。對本地ip抓包捕獲9000端口內(nèi)容,與沒有采用TSL安全傳輸進行對比;對TSL握手階段不同階段的抓包內(nèi)容進行對比。
對比圖1和圖2中內(nèi)容,在沒有采用TLS協(xié)議的TCP通信中,傳輸?shù)氖敲魑膬?nèi)容;使用了TSL協(xié)議之后,捕獲的TCP傳輸內(nèi)容不再可見,是加密的內(nèi)容。
對比圖3和圖4中的內(nèi)容,得知TSL握手協(xié)議的前面三次會話是采用的明文傳輸,所以服務(wù)端發(fā)送給客戶端的證書也是明文傳輸?shù)?直到會話密鑰產(chǎn)生后的傳輸內(nèi)容才采用密文傳輸。
4.2結(jié)論
在典型的TSL通信場景中,客戶端向服務(wù)器索取證書,證書被信任機構(gòu)簽名生效,且包含一個公鑰。客戶端對證書中聲明的身份進行第三方驗證,確認其安全匹配??蛻舳伺c服務(wù)器就加密算法、壓縮以及密鑰等設(shè)定進行協(xié)商,最后使用協(xié)商結(jié)果的方案對套接字上雙向傳輸?shù)臄?shù)據(jù)進行安全保護。
通過測試對比,采用TSL協(xié)議后的TCP傳輸內(nèi)容為密文,對傳輸數(shù)據(jù)起到了明顯的安全保護,進步改進TCP服務(wù)端,可以在此基礎(chǔ)上構(gòu)建出完整安全的TCP服務(wù)器。
參考文獻:
[1]古爾利(David Gourley)等.HTTP權(quán)威指南[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協(xié)議現(xiàn)狀與研究綜述[J].網(wǎng)絡(luò)新媒體技術(shù),2019,8(01):1-8.
[6]百度百科.TSL[EB/OL].https://baike. baidu. com/item/TLS/2979545.
[7]張興隆,程慶豐,馬建峰.TLS l.3協(xié)議研究進展[J].武漢大學(xué)學(xué)報:理學(xué)版,2018,64(06):471-484.
[8]簡書.OpenSSL下載安裝[EB/OL].htfps://www.jianshu.c om/p/12aldc4ah7aO
【通聯(lián)編輯:代影】
收稿日期:2019-11-11
基金項目:湖南省教育廳科學(xué)研究規(guī)劃課題(編號:17C0477)作者簡介:文志華(1982-),男,湖南桃江人,講師,碩士,主要研究方向為網(wǎng)絡(luò)安全、智能醫(yī)療信息處理;周序生,副教授,碩士,主要
研究方向為網(wǎng)絡(luò)安全、大數(shù)據(jù)處理。