SSL安全協(xié)議(中文版)_第1頁
SSL安全協(xié)議(中文版)_第2頁
SSL安全協(xié)議(中文版)_第3頁
SSL安全協(xié)議(中文版)_第4頁
SSL安全協(xié)議(中文版)_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

/SSL協(xié)議Version3.03/4/96 翻譯—隋立穎一本文件的地位本文件是一個Internet草案。Internet草案是Internet工程特遣組(ITEF)及其領域和工作組的工作文件.請注意,其他團體也可以發(fā)布Internet草案.Internet草案自公布之日起至多六個月內(nèi)有效。它可以隨時被修改、被替換,或被其他文件所覆蓋。把Internet草案作為文獻來引用,除說明是“正在進展中的工作”以外,是不合適的。要了解任何一個Internet的當前地位,請查閱如下網(wǎng)址:(美國東海岸),(歐洲),(美國東海岸)以及munnari。oz.au(環(huán)太平洋地區(qū))。其中InternetDraftsShadowDirectories目錄下的1id—abstract.txt列表可提供這方面的信息。二摘要本文制定了安全套接層協(xié)議第3。0版(SSL3.0)規(guī)范.SSL是一個提供Internet上的通信隱私性的安全協(xié)議.該協(xié)議允許客戶端/服務器應用之間進行防竊聽、消息篡改及消息偽造的安全的通訊。三簡介制定SSL協(xié)議的初衷是為通訊雙方提供安全可靠的通訊服務,協(xié)議包含兩個層次:其較低的SSL記錄層協(xié)議位于某一可靠的傳輸協(xié)議(例如TCP[TCP]協(xié)議)之上;SSL記錄層協(xié)議用來對其上層的協(xié)議進行封裝。握手協(xié)議就在這些被封裝的上層協(xié)議之中,它允許客戶端和服務器彼此認證對方;并且在應用協(xié)議發(fā)出或收到第一個數(shù)據(jù)之前協(xié)商加密算法和加密密鑰。這樣作的原因是保證了應用協(xié)議的獨立性,使低級協(xié)議對高級協(xié)議是透明的。SSL協(xié)議提供的連接安全性具有以下三條屬性連接是安全的。在初始化握手協(xié)議協(xié)商加密密鑰之后傳輸?shù)南⒕鶠榧用艿南?加密的算法為單鑰加密算法(例如DES[DES],RC4[RC4]等)。對方的身份是可以通過非對稱加密算法—即公鑰加密算法(例如RSA[RSA],DSS[DSS]等)來驗證.連接是可靠的。所傳輸?shù)南⒕焕煤灻借€加密的消息文摘(MAC),以保證消息的完整性。安全雜湊(hash)函數(shù)(例如SHA,MD5等)被用來產(chǎn)生消息文摘(MAC).四目標按它們的優(yōu)先級,SSL協(xié)議3.0的目標是在通訊雙方之間利用加密的SSL消息建立安全的連接?;ゲ僮餍?。通訊雙方的程序是獨立的,即一方可以在不知道對方程序編碼的情況下利用SSL3.0成功的交換加密參數(shù).注意:并不是所有的SSL的實例(甚至在同一應用程序內(nèi))都可以成功的連接.例如,如果服務器支持一特定的硬件令牌(token),而客戶端不能訪問此令牌,則連接不會成功??蓴U展性。SSL尋求提供一種框架結(jié)構(gòu),在此框架結(jié)構(gòu)中,在不對協(xié)議進行大的修改的情況下,新的公鑰算法和單鑰算法可以在必要時被加入.這樣做還可以實現(xiàn)兩個子目標避免產(chǎn)生新協(xié)議的需要,因而進一步避免了產(chǎn)生新的不足的可能性。避免了實現(xiàn)一完整的安全協(xié)議的需要.相對的有效性。加密操作,尤其是公鑰加密,對CPU來說是一種很耗時的事,因此SSL協(xié)議引入一可選的對話緩存(CACHE)來減少從頭開始的連接的數(shù)目。同時,它還注意減少網(wǎng)絡的活動。五此文檔的目的SSL協(xié)議版本3。0詳細說明書的主要讀者是要實現(xiàn)此協(xié)議的人和進行加密分析的人。此詳細說明書主要是為這兩類人而寫的,所以它時刻注意反映這兩類人的需要。因此在本詳細說明書中(而不是寫在附錄中)以文本方式包含了許多與算法相關的數(shù)據(jù)結(jié)構(gòu)和規(guī)則,使它們易于被訪問.雖然本詳細說明書包含了維護物理安全性所必須的策略,本詳細說明書并不想提供關于服務和界面的定義.六描述語言(Presentationlanguage)本文檔主要是描述外部表示(externalrepresentation)的數(shù)據(jù)的格式,所以用到了下列簡單、基礎而有點隨意的定義的表示語法,這些語法在結(jié)構(gòu)上來自不同的出處。雖然這些語法在結(jié)構(gòu)上有點象程序設計語言C、在語法和目標上象XDR[XDR],但過分的強調(diào)這種類似是有害的。本描述語言的目的僅僅是描述SSL.6.1基本塊長(Basicblocksize)所有的數(shù)據(jù)項的表示均是顯式說明的,基本數(shù)據(jù)塊的長度為一字節(jié)(也就是說8比特)多字節(jié)的數(shù)據(jù)項是由從上至下、從左至右的多個字節(jié)連接組成。從字節(jié)流的角度來看,一多字節(jié)的數(shù)據(jù)項(在本例中是一數(shù)字)是通過下述公式形成的:value=(byte[0]〈〈8*(n-1))|(byte[1]<<8*(n-2))|。。。|byte[n—1];這種字節(jié)的順序關系是網(wǎng)絡中常用的順序關系即大endian格式.6。2雜項注釋以“/*"開始,以“*/”結(jié)束??蛇x的部分是由將其包含進斜體的括號“[]”中而指定的。單字節(jié)的包含不可解釋的數(shù)據(jù)的實體的類型為opaque6.3向量(Vectors)向量(一維數(shù)組)是一同類型的數(shù)據(jù)元素的流,向量的規(guī)模可以在編寫文檔時說明,也可以留至運行時才指明;不管在哪一種情況下,向量的規(guī)模(即大?。┦怯上蛄恐凶止?jié)的個數(shù)而不是向量中元素的個數(shù)決定的.說明一新類型T'是一固定長度的類型T的向量的語法為:TT'[n];在這里,T’在數(shù)據(jù)流中占n比特,其中n是T的所占字節(jié)數(shù)的倍數(shù)。向量中包含數(shù)據(jù)元素的個數(shù)沒有包含在數(shù)據(jù)流之中。在下例中,Datum被定義為三個連續(xù)的協(xié)議無法解釋的字節(jié)的向量;而Data被定義為三個連續(xù)的Dat(yī)um,一共包含9個字節(jié)opaqueDatum[3];/*三個協(xié)議無法解釋的字節(jié)*/DatumDat(yī)a[9];/*三個連續(xù)的包含三個字節(jié)的向量*/可變長向量可以通過指明合法長度的范圍,即形如<最小長度..最大長度>的形式來定義,在編碼時,在字節(jié)流中實際長度應在向量的內(nèi)容之前,此實際長度是以數(shù)字的形式存儲的,此數(shù)字應能表示此向量的最大長度(ceilinglength)??障蛄恐傅氖且粚嶋H長度為零的向量。TT'<floor..ceiling〉;在下例中,mandatory是一必須包含300到400字節(jié)的opaque類型數(shù)據(jù)的向量,它不能是空向量,其實際長度域占有兩個字節(jié),即uint16,足以表示400(見6。4節(jié)),而longer最多能表示800個字節(jié),即400個uint16的數(shù)據(jù)元素,且〈請合法使用軟件>可以是空向量。它的編碼包含一兩字節(jié)的實際長度域。opaquemandat(yī)ory〈300.。400>;/*長度域為兩個字節(jié),不能為空向量*/uint16longer<0。.800〉;/*零至400個16比特的無符號整數(shù)*/6.4數(shù)字(Numbers)基本的數(shù)字的數(shù)據(jù)類型是無符號字節(jié)(uint8).其他所有的大的數(shù)字均是由6.1節(jié)中描述的固定長度的字節(jié)流連接而成,且它們均是無符號的。下列數(shù)字類型是預定義的:uint8uint16[2];uint8uint24[3];uint8uint32[4];uint8uint64[8];6.5枚舉(Enumerate)另一類稀疏的數(shù)據(jù)類型是枚舉(enum),枚舉類型的數(shù)據(jù)的取值范圍只能是在其定義是聲明的值。每一次定義均定義了一不同的類型。只有相同類型的枚舉數(shù)據(jù)才可以相互賦值和比較,枚舉類型的每個枚舉元素均必須象下例中所示的那樣,被賦一個值。由于枚舉類型這的元素是沒有順序的,所以它們可以取任意順序的不同的值。enum{e1(v1),e2(v2),...,en(vn),[(n)]}Te;枚舉類型的值在字節(jié)流中占據(jù)的空間的大小是其定義的取值范圍中最大的可能值所占的空間大小。下列定義會使類型Color占有一個字節(jié).enum{red(3),blue(5),white(7)}Color;你還可以通過指定一個無標簽的值來強制枚舉類型所占的字節(jié)數(shù),這樣就不需定義一冗余元素了。在下例中,類型Taste在字節(jié)流中占兩個字節(jié)但只能在1,2或4中取值。enum{sweet(1),sour(2),bitter(4),(32000)}Taste;枚舉類型的元素的名字只在定義的類型中是有效的。在第一個例子中,對類型Color中的第二個元素的完全限定引用為Color.blue。這樣的限定當賦值的目標是被說明的時候時是可以忽略的。Colorcolor=Color。blue;/*重復說明,但是合法的*/Colorcolor=blue;/*正確,類型是隱含的*/對于元素的值不會轉(zhuǎn)化為外部表示的枚舉類型,元素的取值信息是可以省略的。enum{low,medium,high}Amount;6。6結(jié)構(gòu)(Constructedtype)結(jié)構(gòu)類型可以由基本的數(shù)據(jù)類型方便的建成,每一次說明均聲明了一新的、唯一的類型,定義的語法類似于C語言中結(jié)構(gòu)的定義。struct{T1f1;T2f2;.。.Tnfn;}[T];在一結(jié)構(gòu)中的各域可以象枚舉中引用元素時的語法一樣用類型名加域名引用,例如T.f2引用的是上例中的第二個域,結(jié)構(gòu)的定義可以嵌套。6.6.1變體結(jié)構(gòu)(Variant)定義結(jié)構(gòu)時可能根據(jù)環(huán)境的不同而有不同的變體,選擇器必須為枚舉類型的數(shù)據(jù),以定義結(jié)構(gòu)中可能的變體,且必須用case語句將select中聲明的每個枚舉元素不會起來。變體結(jié)構(gòu)的結(jié)構(gòu)體可以有一供其引用的標簽.在運行時如何決定變體的機制并沒有在描述語言中規(guī)定。struct{T1f1;T2f2;。.。Tnfn;select(E){casee1:Te1;casee2:Te2;.。..caseen:Ten;}[fv];}[Tv];例如:enum{apple,orange}VariantTag;struct{uint16number;opaquestring<0..10>;/*可變的長度*/}V1;struct{uint32number;opaquestring[10];/*固定的長度*/}V2;struct{select(VariantTag){/*變體的選擇器是隱含的*/caseapple:V1;/*VariantBody的定義,標簽=apple*/caseorange:V2;/*VariantBody的定義,標簽=orange*/}variant_body;/*可選的變體標簽*/}VariantRecord;變體結(jié)構(gòu)可以通過在類型前指定選擇器的值來限定(narrowed),例如:orangeVariantRecord是類型VariantRecord的一限定,它包含類型為V2的variant_body。6.7加密屬性(Cryptographicat(yī)tribute)數(shù)字簽名、流加密、塊加密和公鑰加密這四項加密操作的加密屬性分別為digitally-signed,stream—ciphered,block—ciphered和public-key-encrypted.對一個域進行何種加密操作是由在此域的類型說明前的合適的加密屬性(關鍵字)決定的,加密的密鑰是由當前對話狀態(tài)字隱含給出的(見7.1節(jié))。在數(shù)字簽名中,輸入為一單向哈希函數(shù)(one—wayhashfunction)。當用RSA算法進行簽名時,用簽名私鑰對一36字節(jié)的結(jié)構(gòu)進行簽名,此36字節(jié)的結(jié)構(gòu)是由兩個哈希函數(shù)生成的,一個為SHA,另一個是MD5.當用DSS算法進行簽名時,可以直接對由SHA哈希函數(shù)生成的20字節(jié)的結(jié)構(gòu)進行簽名。在流加密中,明文的長度與由密鑰產(chǎn)生的密文的長度是相同的。此密鑰是由偽隨機數(shù)發(fā)生器生成的安全的密鑰,是根據(jù)時間的變化而變化的。在塊加密中,密文的每一塊均被加密成一塊密文。由于明文的長度并不是固定的,所以有可能在對明文(發(fā)出的數(shù)據(jù))分塊時產(chǎn)生一不滿的塊(塊的長度通常為64比特),此時就需要將此不滿的塊的剩余部分填充數(shù)據(jù),一般來說是填零.在公鑰加密中,單向限門函數(shù)被用來加密要發(fā)出的數(shù)據(jù),用一給定公鑰加密的數(shù)據(jù)僅能由相應的私鑰解出,同樣用一給定私鑰加密的數(shù)據(jù)僅能由相應的公鑰解出。在下例中:stream—cipheredstruct{uint8field1;uint8field2;digitally-signedopaquehash[20];}UserType;哈希函數(shù)的結(jié)果做為簽名算法的輸入,整個結(jié)構(gòu)UserType用流加密進行加密.6.8常量(Constant)有類型的常量可以通過在常量名前加上所希望的類型,并在常量名后給其賦上所期待的值來定義.未限定的類型(opaque,可變長向量,變體結(jié)構(gòu)及帶有opaque的結(jié)構(gòu))不能被賦值。多元素的結(jié)構(gòu)和向量的所有域均應被賦值。例如:struct{uint8f1;uint8f2;}Example1;Example1ex1={1,4};/*令f1=1,f2=4*/七、SSL協(xié)議SSL是一層次化協(xié)議。在每一層,消息均可以包含描述長度、消息的描述及消息的內(nèi)容的域.SSL在傳輸消息時,首先將消息分為其可處理的數(shù)據(jù)塊,可以進行壓縮,將其封裝為一帶消息驗證(MAC)的包,隨之進行加密并傳輸所得到的加密后的消息.在收到消息時,首先解密,然后驗證、解壓縮并重新組合得到原有的消息,將此消息發(fā)向較高的層次。7.1對話及連接狀態(tài)SSL的對話是有狀態(tài)的,是由SSL的握手協(xié)議來同步客戶端和服務器的狀態(tài)的,因而允許它們一致的操作而不管它們的協(xié)議狀態(tài)是否是并行的。從邏輯上講,狀態(tài)被提到了兩次,一次是當前的操作狀態(tài),而另一次是在握手協(xié)議中的未決狀態(tài)。而且,還維持單獨的讀狀態(tài)和寫狀態(tài)。當客戶端或服務器收到changecipherspec消息時,它將未決讀狀態(tài)復制到當前讀狀態(tài).當客戶端或服務器發(fā)出changecipherspec消息時,它將未決寫狀態(tài)復制到當前寫狀態(tài)。當握手協(xié)商完畢時,客戶端或服務器將彼此交換changecipherspec消息(見7.3節(jié)),這樣它們就可以用新同意的cipherspec來進行通信了。SSL對話可以包含若干次安全連接,而且每一方均可以同時有多個對話.對話狀態(tài)包含下列元素:對話標識一由服務器為標識當前活躍的對話或重新開始的對話而隨機選取的字節(jié)流.對等證書對等方的X509。v3[X509]證書,狀態(tài)的此元素可以為空。壓縮方法在加密之前壓縮數(shù)據(jù)所采用的算法。加密說明指出所采用的數(shù)據(jù)加密算法(如沒有采用加密算法,采用DES等)和作消息文摘的算法(如MD5,SHA等),它還定義象hash_size一類的加密的屬性(見附錄A。7)主共享的秘密客戶端和服務器所共享的48比特的共享的秘密.是否可以重開始一標識此對話是否可以用來初始化新的連接的標志。連接狀態(tài)包含下列元素:客戶端和服務器的隨機數(shù)由客戶端和服務器為建立一次連接而隨機選取的一字節(jié)流.服務器的MAC寫共享秘密服務器在對數(shù)據(jù)進行消息驗證(MAC)操作時所使用的共享的秘密.客戶端的MAC寫共享秘密客戶端在對數(shù)據(jù)進行消息驗證(MAC)操作時所使用的共享的秘密。服務器的寫密鑰服務器在對數(shù)據(jù)進行加密時所使用的加密密鑰,此密鑰也是客戶端進行解密時的解密密鑰??蛻舳说膶懨荑€客戶端在對數(shù)據(jù)進行加密時所使用的加密密鑰,此密鑰也是服務器進行解密時的解密密鑰。初始化向量當用CBC方式進行塊加密時,對于每一密鑰系統(tǒng)都將維護一初始化向量(IV)。此域的值是由SSL握手協(xié)議進行初始化的,為以后使用的方便此后的每一記錄的最終的密文塊被保存在記錄的后面。序列號參與連接的每一方都為其發(fā)出的和收到的消息維護一獨立的序列號。當一方發(fā)出或收到ChangeCipherspec消息時,其序列號置為零。序列號的類型為Unit64,所以序列號不能超過264-1。7.2記錄層SSL記錄層由更高的層次那里接收未加解釋的任意長度的非空塊。7。2.1打包記錄層將信息塊分裂為小于或等于214字節(jié)的SSLPlainText記錄。客戶端消息的界限并不反映至記錄層中(也就是說,具有同樣ContentType的多個客戶消息可能會合并為一SSLPlaintext記錄)。struct{uint8major,minor;}ProtocolVersion;enum{change_cipher_spec(20),alert(21),handshake(22),application_dat(yī)a(23),(255)}ContentType;struct{ContentTypetype;ProtocolVersionversion;uint16length;opaquefragment[SSLPl(wèi)aintext.length];}SSLPlaintext;其中type指出采用打包的更高層次的協(xié)議.version協(xié)議的版本號。此文檔所描述的是SSL版本3.0(見附錄A.1。1).lengthSSLPlaintext的字節(jié)長度,此長度不應超過214fragment應用數(shù)據(jù)。此數(shù)據(jù)對由Type域中所指出的更高層次的協(xié)議是透明的,并被視為一獨立的塊。注意:不同的SSL記錄層的CententType數(shù)據(jù)可以交叉存取,應用數(shù)據(jù)一般要比其他的ContentType數(shù)據(jù)要求更低級的傳輸過程。7.2。2記錄的壓縮和解壓縮所有的記錄均應用在當前的對話狀態(tài)中定義的壓縮算法進行壓縮.一般地,此算法為當前活躍的壓縮算法,但在初始化時它被定義成CompressionMethod。null。壓縮算法將SSLPlaintext結(jié)構(gòu)轉(zhuǎn)換為SSLCompressed結(jié)構(gòu),當CipherSpec變換后,壓縮函數(shù)將刪除其狀態(tài)信息。注意:CipherSpec是在7.1節(jié)中所描述的對話狀態(tài)的一部分,對CipherSpec中各域的引用在本文檔中是用表示語法來表達的。關于CipherSpec的更加詳細的描述見附錄A.7.壓縮必須是無損壓縮且對原文的長度的增加不超過1024比特.如果解壓縮函數(shù)遇到一待解的超過214比特的SSLCompressed.fragment,它將產(chǎn)生一終止的decompression_failure報警(見7.4.2節(jié))。struct{ContentTypetype;/*sameasSSLPlaintext。type*/ProtocolVersionversion;/*sameasSSLPlaintext。version*/uint16length;opaquefragment[SSLCompressed.length];}SSLCompressed;lengthSSLCompressed。fragment的長度(單位:字節(jié))。長度不應超過214+1024.fragmentSSLPlaintext.fragment的壓縮格式。注意:操作CompressionMethod.null是一標識性操作,沒有任何一個域的值被改變(見附錄A。4.1). 實現(xiàn)時請注意:解壓縮函數(shù)的責任是保證消息不會造成內(nèi)部的緩沖區(qū)溢出。7.2。3記錄的有效負荷保護和加密說明(CipherSpec)所有的記錄均用在當前的加密說明(CipherSpec)中定義的加密算法和消息驗證(MAC)算法所保護,一般地,在SSL內(nèi)部有一活躍的CipherSpec,但在初始化時,它的值為SSL_NULL_WITH_NULL_NULL,從值并不提供任何安全性.只有當握手結(jié)束后,參與雙方共享一用于加密記錄和計算消息驗證碼(MACs)的公共秘密。進行加密和消息驗證(MAC)操作的技術有CipherSpec定義,并受CipherSpec。cipher_type的限制。加密和消息驗證(MAC)函數(shù)將一SSLCompressed結(jié)構(gòu)轉(zhuǎn)換為一SSLCiphertext結(jié)構(gòu),解密函數(shù)作相反的過程。傳輸時將包含一序列號,這樣當包丟失、被改變或包被重復收到時可以及時的發(fā)現(xiàn)。struct{ContentTypetype;ProtocolVersionversion;uint16length;select(CipherSpec.cipher_type){casestream:GenericStreamCipher;caseblock:GenericBlockCipher;}fragment;}SSLCiphertext;type類型域被指定為SSLCompressed。type。version版本域被指定為SSLCompressed。version。length指明隨后的SSLCiphertext.fragment的長度(單位:字節(jié))。長度不應超過214+2048。fragment包含消息驗證碼(MAC)的SSLCompressed.fragment加密后的形式。7.2。3.1Null或標準的流加密流加密(包含BulkCipherAlgorithm.null–見附錄A.7)將SSLCompressed.fragment結(jié)構(gòu)轉(zhuǎn)換為SSLCiphertext.fragment流結(jié)構(gòu),或者反之,將SSLCiphertext。fragment結(jié)構(gòu)轉(zhuǎn)換為SSLCompressed.fragment流結(jié)構(gòu)。stream-cipheredstruct{opaquecontent[SSLCompressed。length];opaqueMAC[CipherSpec.hash_size];}GenericStreamCipher;產(chǎn)生的消息驗證碼(MAC)形式為:hash(MAC_write_secret+pad_2+hash(MAC_write_secret+pad_1+seq_num+length+content));其中“+"表示將前后連接起來.pad_1字符0x36在MD5算法中重復48次或在SHA算法中重復40次。pad_2字符0x5c,與pad_1一樣的重復。seq_num從消息的序列號。hash由cipher組合所決定的雜湊算法.請注意,消息驗證碼(MAC)在加密之前就計算出來了。流加密加密的是包含消息驗證碼(MAC)在內(nèi)的整個塊。對于不用同步向量的流加密方法(如RC4),在記錄后邊的流加密方法的狀態(tài)被簡單的用在隨后的包中,若CipherSuite是SSL_NULL_WITH_NULL_NULL,且加密包含指定的操作(也就是說,數(shù)據(jù)還未被加密且消息驗證碼(MAC)的長度為零,標志著不使用消息驗證碼(MAC)),則SSLCiphertext的長度是SSLCompressed的長度與CipherSpec.hash_size的和。7。2.3.2密碼分組鏈接(CBC)塊加密對于塊加密(象RC2或DES),加密和消息驗證(MAC)函數(shù)將SSLCompressed.fragment結(jié)構(gòu)轉(zhuǎn)換成SSLCiphertext。fragment塊結(jié)構(gòu).block-cipheredstruct{opaquecontent[SSLCompressed.length];opaqueMAC[CipherSpec.hash_size];uint8padding[GenericBlockCipher。padding_length];uint8padding_length;}GenericBlockCipher;消息驗證(MAC)與7.2。3。1節(jié)中描述的一樣。padding為了使明文的長度成為加密塊長度的倍數(shù)而添加的隨機字節(jié)。padding_length填料的長度必須比加密塊的長度小且可以為零,填料的長度應使結(jié)構(gòu)GenericBlockCipher的總長度是加密塊長度的倍數(shù)被加密的數(shù)據(jù)長度(SSLCiphertext.length)應比SSLCompressed的長度,CipherSpec。hash_size和填料的長度的總和多一。注意:對于CBC塊加密來說,其第一個記錄的CBC塊鏈的初始化向量(IV)是由握手協(xié)議提供的,隨后記錄的IV是前一記錄的最后一密文塊。7。3更改加密說明cipherspec的協(xié)議更改加密說明(cipherspec)的協(xié)議在加密策略中被用來通知參與各方這一改變。協(xié)議只包含一個在當前(不是未決的)CipherSpec下加密并壓縮過的消息.此消息包含一個字節(jié),其值為1。struct{enum{change_cipher_spec(1),(255)}type;}ChangeCipherSpec;更改cipherspec的消息可以由客戶端或服務器發(fā)出來通知對方隨后的記錄將由剛協(xié)商好的CipherSpec和密鑰來保護.收方收到此消息后,將讀未決狀態(tài)復制到當前讀狀態(tài)中。客戶端在密鑰交換握手和證書驗證消息(如果有的話)之后發(fā)出更改cipherspec的消息,服務器則在成功的處理了客戶端發(fā)來的密鑰交換消息之后發(fā)出一更改cipherspec的消息。一意外的更改cipherspec消息應產(chǎn)生一unexpected_message報警(見7。4。2節(jié))。當重新開始一原有的對話時,更改cipherspec消息應在問候消息(hellomessages)之后發(fā)出.7.4報警協(xié)議由SSL記錄層所支持的一種媒體類型為報警類型,報警消息帶有此消息的嚴重程度的編碼和對此報警的描述。最嚴重一級的報警消息將立即終止連接,在這種情況下,本次對話的其他連接還可以繼續(xù)進行,但對話標識符必須無效以防止此失敗的對話重新建立新的連接。象其他的消息一樣,報警消息是利用由當前連接狀態(tài)所指出的算法加密和壓縮的。enum{warning(1),fatal(2),(255)}AlertLevel;enum{close_notify(0),unexpected_message(10),bad_record_mac(20),decompression_failure(30),handshake_failure(40),no_certificate(41),bad_certificate(42),unsupported_certificate(43),certificate_revoked(44),certificate_expired(45),certificat(yī)e_unknown(46),illegal_parameter(47)(255)}AlertDescription;struct{AlertLevellevel;AlertDescriptiondescription;}Alert;7.4.1關閉報警客戶端和服務器為避免截斷攻擊必須共享連接已關閉這一信息,它們中的任一方均可以初始化關閉信息的交換.close_notify此消息通知收方發(fā)出者不會在此連接內(nèi)再發(fā)任何消息,當一次對話中的所有連接都沒有恰當?shù)腸lose_notify消息而終止時,此次對話是不能重新開始的。close_notify消息的嚴重程度是警告級的7.4.2錯誤報警在SSL握手協(xié)議中的錯誤處理是很簡單的,當發(fā)現(xiàn)一個錯誤后,發(fā)現(xiàn)方將向?qū)Ψ桨l(fā)一消息。當傳輸或收到最嚴重一級的的報警消息時,連接雙方均立即終止此連接。服務器和客戶端均應忘記前一次對話的標識符、密鑰及有關失敗的連接的共享信息.SSL中定義了下列錯誤報警:unexpected_message收到一意外的消息,此報警通常是致命性錯誤的報警且不應在正常的連接中被觀察到。bad_record_mac當收到一帶有不正確的MAC的記錄時,將返回此報警。此報警通常是致命性錯誤的報警.decompression_failure解密函數(shù)收到不合法的輸入(如數(shù)據(jù)太長等),此報警通是致命性錯誤的報警.handshake_failure收到一handshake_failure報警消息表明發(fā)出者不能接受現(xiàn)有的選項所提供的安全參數(shù)的集合,此報警通常是致命性錯誤的報警。no_certificate當被要求給出證書而沒有合法的證書時,將發(fā)出一no_certificat(yī)e報警消息.bad_certificate當一證書被訛用、或者證書中不會的簽名不能被正確的認證等時,發(fā)出此報警。unsupported_certificate一有不被支持的類型的證書(如包含了用戶自定義的擴展).certificate_revoked一被其發(fā)出者取消的證書.certificat(yī)e_expired一過期了的或不合法證書。certificate_unknown由一些不明的發(fā)出者發(fā)出的證書所引起的證書的不可接受性。illegal_parameter在握手中的一個域的值溢出或與其他域的值不一致,此報警是致命性錯誤的報警。7.5握手協(xié)議總攬對話狀態(tài)的加密的參數(shù)是由SSL握手協(xié)議產(chǎn)生的,握手協(xié)議是在SSL記錄層的頂部操作的。當一SSL客戶和服務器首次開始通訊時,它們就協(xié)議版本、加密算法的選擇、是否驗證對方及公鑰加密技術的應用進行協(xié)商以產(chǎn)生共享的秘密,這一處理是由握手協(xié)議完成的,可以總結(jié)如下:其中*表示不是必須發(fā)出的可選的或依賴于環(huán)境的消息客戶端首先發(fā)出客戶問候消息(clienthellomessage),服務器收到之后或者發(fā)出服務器問候消息(serverhellomessage),或者發(fā)生一終止性的錯誤然后此次連接將無法建立客戶和服務器問候消息(clienthellomessage)被用來在客戶端和服務器之間建立安全的性能的協(xié)商,客戶和服務器的問候消息(clienthellomessage)將產(chǎn)生了下列屬性:協(xié)議版本號、對話標識符、加密套接字及壓縮方法,而且產(chǎn)生了兩個隨機數(shù)ClientHello。random和ServerHello.random并且相互交換.在問候消息之后,若要求驗證身份,服務器將發(fā)出其證書,另外,如果需要的話(例如,如果他們的服務器沒有證書,或者其證書僅用來進行簽名),將發(fā)出一個serverkeyexchange消息。如果這個服務器已經(jīng)被認證,而且被所選的密碼組(cipherSUITE)所允許的話,它將向客戶端請求證書?,F(xiàn)在這個服務器將發(fā)出服務器問候結(jié)束消息(serverhellodonemessage),表明握手過程中的問候消息階段已經(jīng)結(jié)束。這個服務器接著將等候客戶端的回答。如果服務器發(fā)出一個certificaterequest消息,客戶端必須發(fā)出證書消息(certificatemessang),或者一個nocertificate報警?,F(xiàn)在,客戶端密鑰交換消息(clientkeyexchangemessage)準備發(fā)送,而且消息的內(nèi)容將取決于在客戶端問候消息(clienthellomessage)和服務器問候消息(serverhellomessage)之間所選擇的公鑰算法。如果客戶端已經(jīng)發(fā)出了一個具備簽名能力的證書,一個數(shù)字簽名后的證書驗證消息(certificateverifymessage)將被發(fā)送以確認此證書的合法性。就這一點而言,一個改變加密說明(changecipherspec)消息是被客戶端發(fā)送的,而且客戶端將未決的CipherSpec復制到當前CipherSpec。然后,客戶端立即用協(xié)商的新的算法、密鑰、和共享信息發(fā)出結(jié)束消息。服務器將發(fā)出其自己的改變cipherspec消息(changecipherspecmessage)作為回應,將未決(pending)cipherspec復制到當前CipherSpec,并用新的cipherspec發(fā)出其結(jié)束消息。此時,握手過程結(jié)束,客戶端和服務器可以開始交換應用層數(shù)據(jù)了(見上圖).注意:為了避免通道延遲,changeCipherspec是一獨立的SSL協(xié)議的媒體類型,而并非一SSL握手消息.客戶端客戶端服務器客戶端問候服務器問候changeCipherSpec服務器結(jié)束changeCipherSpec客戶端結(jié)束應用數(shù)據(jù)應用數(shù)據(jù)客戶端首先利用需要重新開始的對話的對話標識符發(fā)出客戶端問候消息(ClientHellomessage),服務器檢查對話緩存來尋找匹配的對話,若找到匹配的對話,服務器將在指定的對話狀態(tài)下重新建立連接,它將發(fā)出帶有對話標識符的服務器問候消息(ServerHello)。此時,客戶端和服務器均必須發(fā)出改變cipherspec消息(changecipherspecmessage)和結(jié)束消息(finishedmessage),只要此重新建立連接一完畢,客戶端和服務器將交換應用層數(shù)據(jù)(見上圖)。若沒找到找到的對話標識符,服務器將產(chǎn)生新的對話標識符,然后SSL客戶和服務器將進行正常的握手過程。每一消息的內(nèi)容和重要性將在以下各節(jié)中詳細的描述。7。6握手協(xié)議SSL握手協(xié)議是SSL記錄協(xié)議(recordProtocol)的一個高級的客戶。此協(xié)議用來協(xié)商一對話的安全參數(shù),握手消息被傳給SSL記錄層,在那里這些消息被封裝在一個或多個SSLPl(wèi)aintext結(jié)構(gòu)之中,這些SSLPlaintext結(jié)構(gòu)由當前活躍的對話狀態(tài)中所指定的參數(shù)進行處理和傳輸。enum{hello_request(0),client_hello(1),server_hello(2),certificate(11),server_key_exchange(12),certificat(yī)e_request(13),server_hello_done(14),certificate_verify(15),client_key_exchange(16),finished(20),(255)}HandshakeType;struct{HandshakeTypemsg_type;/*握手消息的類型*/uint24length;/*握手消息體的字節(jié)數(shù)*/select(HandshakeType){casehello_request:HelloRequest;caseclient_hello:ClientHello;caseserver_hello:ServerHello;casecertificate:Certificate;caseserver_key_exchange:ServerKeyExchange;casecertificat(yī)e_request:CertificateRequest;caseserver_hello_done:ServerHelloDone;casecertificate_verify:CertificateVerify;caseclient_key_exchange:ClientKeyExchange;casefinished:Finished;}body;}Handshake;握手協(xié)議的消息必須按指定的順序發(fā)出(此順序如上所示),若不按此順序發(fā)出,則會重新終止性錯誤.7.6.1問候消息(Hellomessage)問候消息用來在客戶端和服務器之間交換彼此安全系統(tǒng)的性能。當一個對話剛開始時,CipherSpec中的加密、雜湊(hash)和壓縮算法均初始化為Null,當前的CipherSpec被用來協(xié)商這些參數(shù)。7.6.1。1Hellorequest要求問候消息(hellorequestmessage)可以由服務器在任何時間發(fā)出,但若客戶端正在進行握手過程的話,此消息將會被客戶端所忽略.它只是一個簡單的通知,通知客戶端可以在方便的時候發(fā)出一客戶問候消息(clienthellomessage)來開始一協(xié)商的過程。注意:由于握手消息是比應用層數(shù)據(jù)的傳輸優(yōu)先級高,所以協(xié)商的時間不應超過最大長度的應用層數(shù)據(jù)消息的傳輸時間的一到兩倍。在發(fā)出要求問候消息之后,在握手協(xié)商未完成之前服務器不應再重復發(fā)出此消息。一處于協(xié)商狀態(tài)中的客戶可以簡單的忽略其收到隨后要求問候消息。要求問候消息的結(jié)構(gòu)如下: struct{}HelloRequest;7。6.1。2客戶問候消息(Clienthello)當一客戶第一次與服務器進行連接時,它必須發(fā)客戶問候消息(Clienthello)作為它的第一個消息??蛻粢部梢詫⒋讼⒆鳛閷Ψ掌靼l(fā)來的要求問候消息的回應,還可以作為它自己想重新協(xié)商一已存在的對話的安全參數(shù)的標志發(fā)出此消息??蛻魡柡蛳ⅲǎ胠ienthello)包含一以后會在協(xié)議中用到的隨機結(jié)構(gòu)struct{uint32gmt_unix_time;opaquerandom_bytes[28];}Random;gmt_unix_time以標準的UNIX的32位形式表示的發(fā)出者的內(nèi)部時鐘的當前時間和日期。SSL協(xié)議中并不要求時鐘必須是準確的,更高級的協(xié)議或應用層協(xié)議可能會對時鐘有更高的要求.random_bytes一由安全隨機數(shù)發(fā)生器產(chǎn)生的28字節(jié)的隨機數(shù)??蛻魡柡蛳ⅲǎ胠ienthello)包含一可變長度的對話標識符,如果此域的值非空,則此值標識了在同一客戶和同一服務器之間的一次對話,此次對話的安全參數(shù)是客戶端想重新使用的。這個對話的標識符也許是來自一個早期的連接,此次連接,或另一個當前活動的連接。如果客戶端僅僅要更新這個隨機結(jié)構(gòu)及一次連接的導出值的話,第二種選擇是有用的,而第三種選擇使得不必完全重復握手協(xié)議而同時建立幾種同步且獨立的安全連接成為可能.對話標識符的實際內(nèi)容由服務器定義。opaqueSessionID<0。。32>;注意:服務器不能在對話標識符中放置機密信息,不能使假的對話標識符中的內(nèi)容導致任何泄密。這個包含在由客戶端傳向服務器的客戶問候消息(clienthello)中的加密套接字(CipherSuite)列表包含了加密算法的組合,此列表是客戶端所支持的的加密算法的列表,且此列表的順序是由客戶端按其自身的偏愛而選定的(列表的第一項是其最喜愛的).每一CipherSuite同時定義了一個密鑰交換算法和一個CipherSpec。服務器將或者選擇一個CipherSuite,或者,如果未給出可接受的選擇,將返回一個handshakefailure報警并關閉連接。uint8CipherSuite[2];/*加密組選擇器*/此客戶問候消息(clienthello)包含了一個由客戶端支持的壓縮算法的列表,且根據(jù)客戶端的偏好排序.如果服務器不支持客戶端所定義的任何一種壓縮算法,則此次對話失敗。enum{null(0),(255)}CompressionMethod;問題:需要支持哪一種要壓縮算法正處于調(diào)查之中.客戶問候消息(clienthello)的結(jié)構(gòu)如下:struct{ProtocolVersionclient_version;Randomrandom;SessionIDsession_id;CipherSuitecipher_suites<2.。216-1>;CompressionMethodcompression_methods〈1.。28—1〉;}ClientHello;client_version客戶端希望在此次對話中使用的SSL協(xié)議的版本。這應該是被客戶端所支持的最新的版本(最高值)。對于本文所描述的SSL協(xié)議,版本號應該是3.0。(關于背景兼容信息請見附錄E)。random一個客戶端生成的隨機結(jié)構(gòu)。session_id客戶端在此次連接中想使用的對話標識符(ID)。如果沒有可用的session-ID或者客戶端想要生成新的加密參數(shù),這個值應該為空.cipher_suites這是一個由客戶端支持的,由客戶端按其自身的偏愛而選定的加密套接字的列表(列表的第一項是其最喜愛的),如果session_id域非空(暗示重新開始一已有的對話),則此向量必須至少包含來自已有對話的cipher_suite。加密套接字的值的定義見附錄A。6。compression_methods這是一個由客戶端支持的壓縮算法的列表,他根據(jù)客戶端自身的偏愛而選定的(列表的第一項是其最喜愛的),如果session_id域非空(暗示重新開始一已有的對話),則此向量必須至少包含一個來自已有對話的compression_methods的參數(shù).所有實現(xiàn)均必須支持CompressionMethod.null。繼發(fā)送clienthello消息之后,客戶端等候一個服務器問候消息(serverhellomessage)。除了hello消息外,由服務器返回的任何其他握手消息,均被視為致命錯誤(fatalerror).實現(xiàn)時注意:只有當結(jié)束消息(finishedmessage)發(fā)送之后,應用程序的數(shù)據(jù)才能被發(fā)送。在一個合法的結(jié)束(finished)消息被收到之前,就傳輸應用程序的數(shù)據(jù)被認為是不安全的.如果此次連接有一個當前的,非空的加密,則此絕對的限制將被放寬。7。6。1.3服務器問候消息(Serverhello)服務器處理客戶端問候消息(clienthello)并且對客戶端問候消息作出握手失敗(handshake_failure)警告或者發(fā)出服務器問候消息(serverhello)作為響應。struct{ProtocolVersionserver_version;Randomrandom;SessionIDsession_id;CipherSuitecipher_suite;CompressionMethodcompression_method;}ServerHello;server_version這個域?qū)蛻舳嗽诳蛻舳藛柡蛳?clienthello)中建議使用的最低版本和被服務器所支持的最高版本.對于使用本詳細說明書的版本來說,版本號應為3.0(關于背景兼容性的詳細信息請見附錄E)random這個結(jié)構(gòu)由服務器產(chǎn)生,且必須與客戶問候消息中的ClientHello。random不同,并且獨立于ClientHello.random。session_id這是對應于此次連接的對話標識.若客戶問候消息中的ClientHello.session_id非空,服務器將在對話緩存器中尋找匹配的對話。如果匹配被找到并且服務器希望利用給定的對話對話狀態(tài)碼建立一個新的連接,服務器將用與客戶問候消息中給定的相同的值響應,這確認了一個重新開始的對話,且對話雙方將在收到對方的直到finished消息之前將繼續(xù)執(zhí)行下去。否則,這個域?qū)粋€與客戶問候消息中的session_id不同的值以標志一個新的對話。服務器可以返回一個空對話標識(session_id)用來表示這個對話將不會被緩存,而且因此不能被重新開始。Cipher_suite由服務器從客戶端問候消息中的ClientHello.cipher_suites列表中選擇一個加密套接字而得到的。對于重新開始的對話,此域的值是從重新開始的對話狀態(tài)字中得到的。compression_method由服務器從客戶端問候消息中的compress_method列表中選擇的一壓縮算法。對于重新開始的對話此域的值是從重新開始的對話狀態(tài)字中得到的.7.6.2服務器的證書(Servercertificate)如果服務器要求被認證(通常都是這么要求的),則服務器在發(fā)出服務器問候消息(serverhellomessage)之后接著發(fā)出服務器證書。證書的類型必須是由被選擇的加密套接字中密鑰交換算法所支持的,通常是X。509.版本3的證書(或是一在Fortezza[FOR]下的修改過的X.509證書.客戶端的證書的類型與服務器的證書類型相同。opaqueASN.1Cert〈1。。224-1〉;struct{ASN.1Certcertificate_list〈1。.224—1>;}Certificate;certificate_list證書鏈中包含一序列X.509。版本3的證書,這些證書的順序是首先是要驗證的一方的證書,然后是發(fā)出前一個證書的一方的證書…最后是根的證書。注意:由于沒有使用PKCS#6[PKCS6]擴充證書,所以PKCS#7[PKCS7]也不能做為證書向量的格式來使用。且PKCS#7定義了一個集合而不是一個序列,從而使解析證書列表的任務更為復雜.7.6。3服務器密鑰交換消息(Serverkeyexchangemessage)若服務器沒有證書,或只有供其簽名用的公鑰證書(例如DSS[DSS]證書,只供簽名的RSA[RSA]證書),或使用了Fortezza/DMS密鑰交換,則服務器發(fā)出服務器密鑰交換消息(serverkeyexchangemessage)。當服務器的證書中包含Diffie-Hellman[DH1](即公鑰加密)參數(shù)時,則不發(fā)出此消息。注意:根據(jù)當前的美國出口法律,在軟件中用于密鑰交換的超過512比特的RSA模塊是不允許出口的。對于此消息,長的RSA密鑰可以做為只用作簽名的證書來簽用作密鑰交換的臨時的短的RSA密鑰。enum{rsa,diffie_hellman,fortezza_dms}KeyExchangeAlgorithm;struct{opaquersa_modulus<1。.216—1>;opaquersa_exponent<1。。216-1〉;}ServerRSAParams;其中:rsa_modulus服務器的臨時的RSA密鑰的模數(shù).rsa_exponent服務器的臨時的RSA密鑰的公開指數(shù)。struct{opaquedh_p<1..216-1〉;opaquedh_g<1.。216—1>;opaquedh_Ys〈1..216-1>;}ServerDHParams;/*短期的DH參數(shù)*/其中:dh_pDiffie—Hellman操作中用到的質(zhì)模數(shù)。dh_gDiffie-Hellman操作中用到的發(fā)生器。dh_Y服務器的Diffie-Hellman公開值(gXmodp).struct{opaquer_s[128];}ServerFortezzaParams;其中:r_s服務器為密鑰交換算法而生成的隨機數(shù)。digitally-signedstruct{select(SignatureAlgorithm){caseanonymous:struct{};casersa:opaquemd5_hash[16];opaquesha_hash[20];casedsa:?opaquesha_hash[20];};}Signature;struct{select(KeyExchangeAlgorithm){casediffie_hellman:ServerDHParamsparams;Signaturesigned_params;casersa:ServerRSAParamsparams;Signaturesigned_params;casefortezza_dms:ServerFortezzaParamsparams;};}ServerKeyExchange;其中:params ?? 服務器的密鑰交換參數(shù)。signed_params ?相應的參數(shù)值的哈希值,及對此哈希值的簽名。md5_hashMD5(ClientHello。random+Serverhello。random+ServerParams);sha_hashSHA(ClientHello.random+ServerHello。random+ServerParams);enum{anonymous,rsa,dsa}Signat(yī)ureAlgorithm;7.6.4證書請求(Certificaterequest)如果選擇的加密套接字允許的話,一非匿名的服務器可以向客戶端要求客戶端的證書。enum{rsa_sign(1),dss_sign(2),rsa_fixed_dh(3),dss_fixed_dh(4),rsa_ephemeral_dh(5),dss_ephemeral_dh(6),fortezza_dms(20),(255)}ClientCertificateType;opaqueDistinguishedName<3.。216-1>;struct{ClientCertificateTypecertificate_types<1.。28-1>;DistinguishedNamecertificate_authorities<3。.216—1>;}CertificateRequest;certificate_types此域的值是一被請求的證書的類型的列表,此列表是按服務器的偏好的先后順序排序的.certificate_authorities是可接受的證書授權當局的唯一的辨別名的列表.注意:唯一的辨別名是由[X509]中導出的.注意:對于一匿名的服務器來說,請求客戶端發(fā)出客戶端的證書是一致命的握手失敗報警。7。6.5服務器問候結(jié)束(Serverhellodone)由服務器發(fā)出的服務器問候結(jié)束消息(serverhellodonemessage)是表明服務器問候和其相關的消息的結(jié)束。當服務器發(fā)出此消息后,它將等待客戶端的回應。struct{}ServerHelloDone;當客戶端收到服務器問候結(jié)束消息(serverhellodonemessage)后,若它要求的話,它將驗證服務器的證書是否合法,并且檢查在服務器問候消息中的參數(shù)是否是可接受的。7.6。6客戶端的證書(Clientcertificate)客戶端證書是客戶端收到服務器問候結(jié)束消息(serverhellodonemessage)后所能發(fā)出的第一個消息。只有當服務器要求客戶端的證書時客戶端才發(fā)出此消息。如果客戶端沒有合適的證書,則它發(fā)出沒有證書報警(nocertificatealert),此報警僅僅是一個警告,若服務器要求客戶端認證,則服務器回應一握手失敗的致命性的報警。客戶端的證書的格式的定義件7。6.2節(jié)。注意:客戶端的Diffie-Hellman證書必須與服務器指定的Diffie-Hellman參數(shù)相匹配.7.6.7客戶端密鑰交換消息(Clientkeyexchangemessage)是否選擇發(fā)出此消息依賴于在密鑰交換算法定義中選擇的公鑰算法(見7。6.3節(jié))struct{select(KeyExchangeAlgorithm){casersa:EncryptedPreMasterSecret;casediffie_hellman:ClientDiffieHellmanPublic;casefortezza_dms:FortezzaKeys;}exchange_keys;}ClientKeyExchange;選擇合適的記錄結(jié)構(gòu)的信息在未決的對話狀態(tài)字中(見7.1節(jié))。7。6.7。1RSA加密的預主秘密消息(RSAencryptedpremastersecretmessage)若在密鑰一致性及認證時使用的是RSA算法,則客戶端產(chǎn)生一48比特的預主秘密(pre-mastersecret),并用服務器證書中的公鑰或一由服務器密鑰交換消息中得到的臨時RSA密鑰對其進行加密,然后將加密的結(jié)果用一加密的預主秘密(encryptedpremastersecret)消息發(fā)給服務器。

struct{ProtocolVersionclient_version;opaquerandom[46];}PreMasterSecret;client_version客戶端所支持的最新的SSL版本,此域用來發(fā)現(xiàn)版本重算攻擊(versionroll—backattacks)。random 46比特安全產(chǎn)生的隨機數(shù)。struct{public-key—encryptedPreMasterSecret pre_master_secret;}EncryptedPreMasterSecret;pre_master_secret由客戶端產(chǎn)生的此隨機數(shù)是用來產(chǎn)生8.1節(jié)中說明的主秘密(mastersecret)的。7.6.7.2Fortezza密鑰交換消息(Fortezzakeyexchangemessage)在FortezzaDMS下,客戶端利用Fortezza密鑰交換算法(KEA)得到一標記加密密鑰(TokenEncryptionKey(TEK))??蛻舳死梅掌髯C書中的服務器公鑰和其自身的標記參數(shù)來計算KEA,并且利用其自身的參數(shù)發(fā)出供服務器產(chǎn)生TEK的公開參數(shù).客戶端產(chǎn)生對話密鑰,用TEK封裝后發(fā)給服務器;客戶端還產(chǎn)生對話密鑰的初始向量(IV)和TEK,并將它們發(fā)給服務器;它還初始一48比特的隨機的預主秘密,用TEK加密后發(fā)給服務器。struct{opaquey_c<0..128>;opaquer_c[128];opaquey_signature[20];opaquewrapped_client_write_key[12];opaquewrapped_server_write_key[12];opaqueclient_write_IV[24];opaqueserver_write_IV[24];opaquemaster_secret_IV[24];block-cipheredopaqueencrypted_pre_master_secret[48];}FortezzaKeys;y_signaturey_signat(yī)ure是KEA公鑰的簽名,是用客戶端的DSS私鑰簽的名.y_c在KEA計算中用到的客戶端的Yc值(公鑰)。若客戶端已發(fā)出其證書且KEA公鑰是合適的,則由于證書中已有此值,此域可以為空。當客戶端發(fā)出一密鑰合適的公鑰的證書的時候,就要有y_c,且y_signature是用客戶端DSS私鑰簽署的KEA公鑰的簽名。它必須在64至128比特之間。r_c客戶端為計算KEA的Rc值。wrapped_client_write_key這是客戶端的寫密鑰,是由TEK封裝的。wrapped_server_write_key這是服務器的寫密鑰,是由TEK封裝的。client_write_IV這是客戶端的寫密鑰的初始化向量。server_write_IV這是服務器的寫密鑰的初始化向量。master_secret_IV這是用來加密預主秘密的TEK的初始化向量。pre_master_secret這是一個由客戶端產(chǎn)生的隨機數(shù),用來產(chǎn)生8。1節(jié)中所描述的主秘密。在上述結(jié)構(gòu)中,它是用TEK加密過的。7。6。7.3客戶端Diffie—Hellman公開值(ClientDiffie—Hellmanpublicvalue)若客戶端的Diffie—Hellman公開值(Yc)未包含在客戶端的證書中的話,此結(jié)構(gòu)將傳送它。Yc使用的編碼方式是由枚舉類型PublicValueEncoding.所決定的。enum{implicit,explicit}PublicValueEncoding;其中:implicit若客戶端的證書中已包含此公開值,則它是隱含的,所以Yc不需再傳了。ExplicitYc需要被傳送。struct{select(PublicValueEncoding){caseimplicit:struct{};caseexplicit:opaquedh_Yc<1.。216—1>;}dh_public;}ClientDiffieHellmanPublic;其中:dh_Yc客戶端的Diffie-Hellman公開值(Yc)。7.6。8證書驗證(Certificateverify)此消息被用來對客戶端的證書提供明顯的驗證。此消息僅在有簽名能力的客戶端證書(即沒有包含固定的Diffie-Hellman參數(shù)的所有證書)發(fā)出之后才被發(fā)出。struct{Signaturesignature;}CertificateVerify;CertificateVerify.signature。md5_hashMD5(master_secret+pad2+MD5(handshake_messages+master_secret+pad1));Certificate.signat(yī)ure。sha_hashSHA(master_secret+pad2+SHA(handshake_messages+master_secret+pad1));在這里,握手消息(handshake_messages)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論