HTTPSSSL/TLSWeihuayang2013-05-06SSL/TLS•SSL(SecureSocketLayer):Netscape公司实现Web通信安全的协议•TLS(TransportLayerSecurity):IETF对SSL的标准化•目前SSL3.0与TLS1.0基本一致SSL/TLS•公用密钥算法:(通常为RSA)用来获得加密密钥交换和数字签名的,此算法使用服务器的SSL数字证书中的公用密钥。•对称加密算法:(如DES或RC4)加密客户端与服务器间传输的数据。•有了服务器的SSL数字证书,客户端也可以验证服务器的身份。SSL协议的版本1和2只提供服务器认证。版本3添加了客户端认证,此认证同时需要客户端和服务器的数字证书。SSL/TLS连接•TLS的连接状态是TLS记录协议的操作环境。它指明了压缩算法、加密算法和MAC算法。此外,这些算法的参数要知道:在读和写两个方向上的用于连接的MAC密文、(bulk)加密密钥和初始化向量Ivs。逻辑上讲,一般有四个连接状态:currentreadstates和currentwritestates,pendingreadstates和pendingwritestates。所有的记录都在currentreadstates和currentwritestates下处理。所有pendingstates的参数都是有TLS的握手协议设置的。握手协议可以选择性的将pendingstates转换为currentstates,在这种情况下,适当的currentstates被处理,取而代之的是pendingstates。pendingstates重新初始化为emptystates。将一个未用安全参数初始化的状态置为currentstates是不合法的。初始currentstates常常是没有规定使用的加密、压缩或者MAC算法。SSL/TLS会话•下面是RFC2246上session的定义:•ATLSsessionisanassociationbetweenaclientandaserver.Sessionsarecreatedbythehandshakeprotocol.Sessionsdefineasetofcryptographicsecurityparameters,whichcanbesharedamongmultipleconnections.Sessionsareusedtoavoidtheexpensivenegotiationofnewsecurityparametersforeachconnection.SSL/TLS协议层次•SSL/TLS协议分两层:–上层:TLS握手协议、TLS密码变化协议、TLS警告协议、HTTP数据–下层:TLS记录协议SSL/TLS上层协议•HandshakeProtocol(22):完成会话的建立•ChangeCipherSpecProtocol(20):完成会话中加密方式(CipherSuite)的确认•AlertProtocol(21):表示SSL会话错误消息•ApplicationDataProtocol(23):(被加密的)HTTP数据Handshakeprotocol类型(1)•enum{•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),•(255)•}HandshakeType;Handshakeprotocol类型(2)消息类型说明参数hello_request握手请求,服务器可在任何时候向客户端发送该消息。若客户端正在进行握手过程就可忽略该消息。否则客户端发送cleint_hello消息,启动握手过程。无client_hello客户启动握手请求,该消息时当客户第一次连接服务器时向服务器发送的第一条消息。该消息中包括了客户端支持的各种算法。若服务器端不能支持,则本次会话可能失败。版本、随机数、会话ID、密文族、压缩方法server_hello其结构与client_hello消息,该消息是服务器对客户端client_hello消息的恢复。版本、随机数、会话ID、密文族、压缩方法server_certificate服务器提供的证书。如果客户要求对服务器进行认证,则服务器在发送server_hello消息后,向客户端发送该消息。证书的类型一般是X.509v3。X.509v3证书链server_key_exchange服务器密钥交换。当服务器不使用证书,或其证书中仅提供签名而不提供密钥时,需要使用本消息来交换密钥。参数、签名Handshakeprotocol类型(3)消息类型说明参数certificate_request用于服务器向客户端要求一个客户证书。类型、授权server_hello_done该消息表明服务器端的握手请求报文已经发送完毕,正在等待客户端的响应。客户端在收到该消息时,将检查服务器提供的证书及其他参数是否是有效、可以接受的。无client_certificate客户端对服务器certificate_request消息的响应,只有在服务器端要求客户证书的时候使用。一般该消息是客户端收到server_hello_done消息后所发送的第一条消息。若客户端没有合适的证书,则向服务器端发送no_certificate的告警消息(无证书可能导致握手失败)X.509v3证书链client_key_exchange客户密钥交换。当客户不使用证书,或其证书中仅提供签名而不提供密钥时,需要使用本消息来交换密钥。参数、签名certificate_verify该消息用于向服务器提供对客户证书的验证。签名finished该消息在“加密规约修改”(ChangeCipherSpec)消息之后发送,以证实握手过程已经成功完成。本消息发送后,发送方开始使用协商的新参数来执行操作。该消息需要在两个方向上传送。散列值SSL/TLS会话(HandshakeProtocol)•第一阶段安全能力的建立(1)客户→服务器:client_hello。(2)服务器→客户:server_hello。•第二阶段服务器认证和密钥交换(3)服务器→客户:server_certificate。(4)服务器→客户:server_key_exchange。(5)服务器→客户:certificate_request。(6)服务器→客户:server_hello_done。•第三阶段客户认证和密钥交换(7)客户→服务器:client_certificate。(8)客户→服务器:client_key_exchange。(9)客户→服务器:certificate_verify。•第四阶段结束阶段(10)客户→服务器:change_cipher_spec。(11)客户→服务器:finished。(12)服务器→客户:change_cipher_spec。(13)服务器→客户:finished。SSL/TLS会话(HandshakeProtocol):恢复会话•Whentheclientandserverdecidetoresumeaprevioussessionorduplicateanexistingsession(insteadofnegotiatingnewsecurityparameters)themessageflowisasfollows:TheclientsendsaClientHellousingtheSessionIDofthesessiontoberesumed.Theserverthenchecksitssessioncacheforamatch.Ifamatchisfound,andtheserveriswillingtore-establishtheconnectionunderthespecifiedsessionstate,itwillsendaServerHellowiththesameSessionIDvalue.Atthispoint,bothclientandservermustsendchangecipherspecmessagesandproceeddirectlytofinishedmessages.Oncethere-establishmentiscomplete,theclientandservermaybegintoexchangeapplicationlayerdata.(Seeflowchartbelow.)IfaSessionIDmatchisnotfound,theservergeneratesanewsessionIDandtheTLSclientandserverperformafullhandshake.•ClientServerClientHello--------ServerHello[ChangeCipherSpec]--------Finished[ChangeCipherSpec]Finished--------ApplicationData-------ApplicationDataSSL/TLS会话建立(1)•CS•Handshake:ClientHello•ContentType是22表示内容是HandshakeProtocolSSL/TLS会话建立(2)•SC•Handshake:ServerHelloSSL/TLS会话建立(3)•SC•Handshake:CertificateSSL/TLS会话建立(4)•SC•Handshake:ServerKeyExchangeSSL/TLS会话建立(5)•SC•Handshake:ServerHelloDoneSSL/TLS会话建立(6)•CS•Handshake:ClientKeyExchangeSSL/TLS会话建立(7)•CS•ChangeCipherSpec:ChangeCipherSpec•ContentType是20表示内容是ChangeCipherSpecProtocolSSL/TLS会话建立(8)•CS•Handshake:EncryptedHandshakeMessageSSL/TLS会话建立(9)•SC•ChangeCipherSpec:ChangeCipherSpecSSL/TLS会话建立(10)•SC•Handshake:EncryptedHandshakeMessageAlertProtocol类型•enum{•close_notify(0),•unexpected_message(10),•bad_record_mac(20),•decryption_failed(21),•record_overflow(22),•decompression_failure(30),•handshake_failure(40),•bad_certificate(42),•unsupported_certificate(43),•certificate_revoked(44),•certificate_expired(45),•certificate_unknown(46),•illegal_parameter(47),•unknown_ca(48),•access_denied(49),•decode_error(50),•decrypt_error(51),•export_restriction(60),•protocol_version(70),•insufficient_security(71),•internal_error(80),•user_ca