TLS/SSL協(xié)議格式(一)

概述

TLS/SSL協(xié)議實際上是分層的,類似IP/TCP協(xié)議;

record.png

TLS Record Protocol

上圖為一個TLS Record Layer包,可用看到其結(jié)構(gòu)為:

  1. ContentType(1byte)

Record類型:

  • change_cipher_spec(20)
  • alert(21)
  • handshake(22)
  • application_data(23)
  1. ProtocolVersion(2bytes)
    TLS/SSL協(xié)議版本號,例如0301表示TLS1.0,0302表示TLS1.1,0303表示TLS1.2;

  2. length(2bytes)
    Body數(shù)據(jù)的長度,最大為2^14;

  3. Body
    消息體,具體的格式由ContentType、是否壓縮、是否加密決定;

TCP包中除了TLS Record Layer外,可以看到前面還有部分內(nèi)容,這是因為按照網(wǎng)絡(luò)協(xié)議七層規(guī)范,層次關(guān)系為數(shù)據(jù)鏈路層-》網(wǎng)絡(luò)層-》傳輸層-》TLS/SSL;
其中數(shù)據(jù)鏈路層的結(jié)構(gòu)為目的地址+源地址+類型,對應(yīng)到圖上:

  • 0x58696c1a3562為目的地MAC地址58:69:6c:1a:35:62
  • 0x985aebdc189d為源MAC地址98:5a:eb:dc:18:9d
  • 0x0800代表IP協(xié)議
  • 4表示IP版本為4
  • 5 表示Header為5,由于單位為4bytes,因此Header長度為20bytes;
  • 0x00表示服務(wù)類型
  • 0x015b表示總長度為347
  • 0x1ba5表示標(biāo)識
  • 0x4000的前3bit為010(即0x02),為flag,表示不分片,后13位表示片偏移量,此處為0
  • 0x40表示存活時間,即64,雖然按照理論64表示存活時間為64秒,但實際上64是指數(shù)據(jù)包被路由器丟棄之前允許通過的網(wǎng)段數(shù)量;
  • 0x06表示傳輸層協(xié)議為TCP
  • 0x0000表示奇偶校驗和,此處應(yīng)該是不進(jìn)行校驗
  • 0x0a2428f1是IP協(xié)議中的源IP地址,即 10.36.40.241
  • 0xf1dcb56fbc是IP協(xié)議中的目的IP地址,即220.181.111.188
  • 0xcb5b是TCP協(xié)議中的源端口,即52059
  • 0x01bb是TCP協(xié)議中的目的端口,即443
  • 0xd0f132bd表示sequence number
  • 0x3d5b2db3表示acknowledge number
  • 0x50表示的前8個bit表示數(shù)據(jù)偏移量,也即Header長度,和前面類似,單位為4bytes,即Header長為20bytes;
  • 0x018表示Flags

Handshake Protocol

當(dāng)TLS Record Protocol的ContentType=22時,Body的內(nèi)容采用Handshake Protocol;

  1. HandshakeType:
    握手類型,包括:
  • hello_request(0)
  • client_hello(1)
  • server_hello(2)
  • certificate(11)
  • server_key_exchange (12)
  • certificate_request(13)
  • server_hello_done(14)
  • certificate_verify(15)
  • client_key_exchange(16)
  • finished(20)
  1. length
    消息長度,占用3bytes;

Hello request

概述

Hello request消息由服務(wù)端發(fā)送給客戶端,通過客戶端重新開始SSL握手;

消息格式

消息體為空;

Client hello

概述

客戶端發(fā)送Client hello消息開始SSL握手;

消息格式

  1. ProtocolVersion

    2bytes,客戶端希望使用的SSL/TLS協(xié)議版本號,一般而言應(yīng)該是客戶端支持的最大版本號;

  2. Random

    • GMT Unix timstamp

      4bytes,標(biāo)準(zhǔn)的UNIX 32位時間格式,表示距離1970年1月1號的秒數(shù);

  • Random bytes
    28bytes,通過SecureRandom產(chǎn)生;
  1. SessionId

    SessionId可為空,長度不固定,編碼方式采用長度+內(nèi)容,用1byte表示長度,讀取時先讀取長度,然后根據(jù)長度讀取內(nèi)容;

  2. CipherSuiteList
    編碼方式采用長度+內(nèi)容,用2bytes表示長度,讀取時先讀取長度,然后根據(jù)長度讀取內(nèi)容;每個CipherSuite占用2bytes;例如0xc030表示TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;具體可參見RFC5246;

  3. CompressionMethod
    壓縮方法,編碼方式采用長度+內(nèi)容,用1byte表示長度,讀取時先讀取長度,然后根據(jù)長度讀取內(nèi)容;

  4. Extensions
    編碼方式采用長度+內(nèi)容,用2bytes表示長度,讀取時先讀取長度,然后根據(jù)長度讀取內(nèi)容;
    每個Extension的格式為:

    type(2bytes)+length(2bytes)+extension body
    

    Extension的type定義請參見RFC 3546,列舉部分如下:

    • server_name(0)
    • max_fragment_length(1)
    • client_certificate_url(2)
    • trusted_ca_keys(3)
    • truncated_hmac(4)
    • status_request(5)

server hello

概述

Server hello消息由服務(wù)端發(fā)送給客戶端,作為Client hello的響應(yīng);如果服務(wù)端無法找到匹配的SSL/TLS版本或CipherSuits,會返回handshake failure alert;

消息格式

  1. ProtocolVersion

    2bytes,服務(wù)端根據(jù)客戶端的ProtocolVersion和自己支持的版本,協(xié)商出來的版本號;

  2. Random

    • GMT Unix timstamp

      4bytes,標(biāo)準(zhǔn)的UNIX 32位時間格式,表示距離1970年1月1號的秒數(shù);

  • Random bytes
    28bytes,通過SecureRandom產(chǎn)生;
  1. SessionId

    SessionId可為空,長度不固定,編碼方式采用長度+內(nèi)容,用1byte表示長度,讀取時先讀取長度,然后根據(jù)長度讀取內(nèi)容;

  2. CipherSuite
    服務(wù)端選用的CipherSuite,占用2bytes;例如0xc030表示TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;具體可參見RFC5246;

  3. CompressionMethod
    占用1byte,服務(wù)端選用的壓縮算法;

  4. Extensions
    編碼方式采用長度+內(nèi)容,用2bytes表示長度,讀取時先讀取長度,然后根據(jù)長度讀取內(nèi)容;
    每個Extension的格式為:

    type(2bytes)+length(2bytes)+extension body
    

    Extension的type定義請參見RFC 3546,列舉部分如下:

    • server_name(0)
    • max_fragment_length(1)
    • client_certificate_url(2)
    • trusted_ca_keys(3)
    • truncated_hmac(4)
    • status_request(5)

Server certificate

概述

服務(wù)端發(fā)送證書到客戶端,客戶端據(jù)此驗證服務(wù)端身份;一般而言,該消息緊跟著Server hello消息;

消息格式

  1. Certificate Chain length

證書鏈所占用的字節(jié),用3bytes表示;

  1. X509 Certificate Lists
    列表中的第一個證書為TLS/SSL會話采用的證書,從該證書從獲取公鑰作為會話的公鑰;每個Certificate的格式為:
  • Certificate Length

    用3bytes表示證書內(nèi)容長度,獲取長度之后再根據(jù)長度獲取證書內(nèi)容;

  • Certificate Content:

    長度由Certificate Length決定;

Server key exchange

概述

該消息一般緊接著Server certificate消息;該消息并不是必須的,取決于協(xié)商出的key交換算法;如果Server certificate并不包含計算premaster的所有參數(shù),則必須發(fā)送該消息;
采用如下算法需要發(fā)送Server certificate消息:

  • RSA_EXPORT (公鑰長度>512bits)
  • DHE_DSS
  • DHE_DSS_EXPORT
  • DHE_RSA
  • DHE_RSA_EXPORT
  • DH_anon

采用如下算法不需要發(fā)送Server certificate消息:

  • RSA(公鑰長度<=512bits)
  • DH_DSS
  • DH_RSA
  • ECDH_ECDSA
  • ECDH_RSA

由于目前使用較多的是ECDHE,本文只介紹該格式:

消息格式

  1. Curve Type

1byte,目前為常量0x03;

  1. Curve Id
    2bytes,列舉部分如下,例如0x0017(23)表示secp256r1;
  • "1.2.840.10045.3.1.7", // (23) secp256r1, NIST P-256
  • "1.3.132.0.34", // (24) secp384r1, NIST P-384
  • "1.3.132.0.35", // (25) secp521r1, NIST P-521
  1. Pubkey length
    1byte,
  2. Pubkey content
    長度由Pubkey length指定;

Certificate request

概述

該消息是可選的,如果服務(wù)端需要驗證客戶端身份,可以通過該消息要求客戶端提供證書;

消息格式

  1. Certificate Type
    證書類型,包含下述類型:
  • rsa_sign(1)
  • dss_sign(2)
  • rsa_fixed_dh(3)
  • dss_fixed_dh(4)
  1. Algorithms

哈希和簽名算法列表,從TLS1.2開始,之前版本不存在該字段;用2bytes存儲算法列表占用的字節(jié)數(shù);
每個Algorithm由hash(1byte)+signature(1byte)組成;

  1. Certificate authority List
    可指定root CA;用2bytes存儲長度,每個Certificate authoritylength(2bytes)+content(長度由length確定)組成;

Client certificate

Server certificate相同

Ceritificate verify

概述

該消息由客戶端發(fā)送到服務(wù)端,校驗證書

消息格式

  1. protocolVersion>=TLS1.2
Hash Algorithm(1byte)+Sgin Algorithm(1byte)+signature length(2bytes)+signature content
  1. protocolVersion<TLS1.2
length(2bytes)+signature content
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容