网络与信息安全安全基础(四)潘爱民,北京大学计算机研究所内容SSL/TLS协议授权和访问控制安全基础部分小结SSL/TLS协议1994年Netscape开发了SSL(SecureSocketLayer)协议,专门用于保护Web通讯版本和历史1.0,不成熟2.0,基本上解决了Web通讯的安全问题Microsoft公司发布了PCT(PrivateCommunicationTechnology),并在IE中支持3.0,1996年发布,增加了一些算法,修改了一些缺陷TLS1.0(TransportLayerSecurity,也被称为SSL3.1),1997年IETF发布了Draft,同时,Microsoft宣布放弃PCT,与Netscape一起支持TLS1.01999年,发布RFC2246(TheTLSProtocolv1.0)SSL/TLS协议协议的设计目标为两个通讯个体之间提供保密性和完整性(身份认证)互操作性、可扩展性、相对效率协议的使用SSL/TLS概况协议分为两层底层:TLS记录协议上层:TLS握手协议、TLS密码变化协议、TLS警告协议TLS记录协议建立在可靠的传输协议(如TCP)之上它提供连接安全性,有两个特点保密性,使用了对称加密算法完整性,使用HMAC算法用来封装高层的协议TLS握手协议客户和服务器之间相互认证协商加密算法和密钥它提供连接安全性,有三个特点身份认证,至少对一方实现认证,也可以是双向认证协商得到的共享密钥是安全的,中间人不能够知道协商过程是可靠的SSL/TLS协议栈为上层协议提供安全性保密性身份认证和数据完整性TLS会话(TLSSession)定义:指客户和服务器之间的一个关联关系。通过TLS握手协议创建session,它确定了一组密码算法的参数。Session可以被多个连接共享,从而可以避免为每个连接协商新的安全参数而带来昂贵的开销。TLSSession都有一个当前状态TLSconnection与底层协议的点对点连接相关联每个connection都与一个session相关联连接是短暂的TLS会话状态实际上是一组参数,包括Sessionidentifier,字节序列,由服务器产生,用来标识一个会话状态Peercertificate(可以为NULL),对方的X.509v3证书Compressionmethod,压缩数据的算法Cipherspec,指定数据加密算法和用于HMAC的散列算法,以及算法的有关参数Mastersecret,客户和服务器之间共享的48字节的数据Isresumable,标记是否这个会话可以被用来初始化一个新的连接TLS连接的状态连接状态也包含一组参数Serverandclientrandom,客户和服务器为每个连接选择的字节序列ServerwriteMACsecret,服务器在发送数据的时候,用于MAC运算的keyClientwriteMACsecret,客户在发送数据的时候,用于MAC运算的keyServerwritekey,服务器加密数据的密钥,以及客户解密数据的密钥Clientwritekey,客户加密数据的密钥,以及服务器解密数据的密钥Initializationvectors,在CBC模式中用到的IV,最初由握手协议初始化,以后,每一个记录的最后一个密文块被用作下一个记录的IVSequencenumbers,每一个连接都需要维护一个序列号,当密码参数变化时,重置为0TLS记录协议TLSRecordProtocol操作过程示意图TLS记录协议中的操作第一步,fragmentation上层消息的数据被分片成214字节大小的块,或者更小第二步,compression(可选)必须是无损压缩,如果数据增加的话,则增加部分的长度不超过1024字节第三步,计算消息认证码(MAC)计算公式:HMAC_hash(MAC_write_secret,seq_num||TLSCompressed.type||TLSCompressed.version||TLSCompressed.length||TLSCompressed.fragment)TLS记录协议中的操作(续)第四步,encryption采用CBC,算法由cipherspec指定数据长度不超过214+2048字节,包括加密之后的数据内容HMACpadding,共padding_length,每个字节的值也是padding_lengthpadding_lengthIV,初始协商指定,以后,前后记录连接起来说明:如果是流密码算法,则不需要paddingTLS记录协议的处理结果结果如下:struct{ContentTypetype;——8位,上层协议类型ProtocolVersionversion;——16位,主次版本uint16length;——加密后数据的长度,不超过214+2048字节EncryptedDatafragment;——密文数据}TLSCiphertext;lengthTLS密码变化协议ChangeCipherSpecProtocol它位于TLS记录协议之上所以,它用到了TLS记录协议的处理过程ContentType=20协议只包含一条消息,一个字节1用途:切换状态把密码参数设置为当前状态在握手协议中,当安全参数协商一致后,发送此消息这条消息使得接收方改变当前状态读参数,使得发送方改变当前状态写参数TLS警告协议AlertProtocol位于TLS记录协议之上所以,也用到了TLS记录协议的处理过程ContentType=21协议数据包含两个字节第一个字节为level:分别为warning(1)和fatal(2)两种情况第二个字节为情况说明Fatal类型的alert消息导致连接立即终止,此时,对应该会话的其他连接可以继续,但是会话标识符无效,以免利用此失败的连接来建立新的连接AlertProtocol第二字节说明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_canceled(90),#no_renegotiation(100),#说明:1*表示该消息往往是fatal级别2#表示该消息往往是warning级别3对于其他的错误情况,发送方可以根据情况决定是warning还是fatal,对于warning消息,接收方可以自行决定如何处理,如果是fatal消息,则一定要当作fatal消息来对待TLS握手协议TLSHandshakeProtocol位于TLS记录协议之上也用到了TLS记录协议的处理过程ContentType=22协议格式用途:当TLS客户和服务器开始通讯的时候,它们要通过协商,在以下信息方面获得一致:协议版本、密码算法、是否认证对方、用什么技术来产生共享秘密数据,等等TLS握手协议的流程交换Hello消息,对于算法、交换随机值等协商一致交换必要的密码参数,以便双方得到统一的premastersecret交换证书和相应的密码信息,以便进行身份认证产生mastersecret把安全参数提供给TLS记录层检验双方是否已经获得同样的安全参数TLS握手协议使用的消息消息参数hello_requestNullclient_hello版本,随机数,会话id,密码参数,压缩方法server_hellocertificateX.509v3证书链server_key_exchange参数,签名certificate_request类型,CAsserver_doneNullcertificate_verify签名client_key_exchange参数,签名finishedHash值第一阶段:建立起安全能力属性客户发送一个client_hello消息,包括以下参数:版本、随机数(32位时间戳+28字节随机序列)、会话ID、客户支持的密码算法列表(CipherSuite)、客户支持的压缩方法列表然后,客户等待服务器的server_hello消息服务器发送server_hello消息,参数:客户建议的低版本以及服务器支持的最高版本、服务器产生的随机数、会话ID、服务器从客户建议的密码算法中挑出一套、服务器从客户建议的压缩方法中挑出一个关于会话ID(SessionID)客户方客户指定的会话ID如果不等于0,则表示它希望基于这个会话来更新已有连接的安全参数,或者创建一个新的连接如果会话ID等于0,则表示客户希望在一个新的会话上建立一个新的连接服务器或者同意客户指定的会话ID,需要检查cache中的会话状态或者返回一个新的会话IDCipherSuite第一个元素指定了密钥交换的方法,TLS支持以下一些方法:RSA,要求服务器提供一个RSA证书DH(Diffie-Hellman),要求服务器的证书中包含了由CA签名的DH公开参数。客户或者在证书中提供DH公开参数,或者在密钥交换消息中提供此参数EDH(EphemeralDiffie-Hellman),产生临时的密钥,DH公开参数由发送者的私钥进行签名,接收者用对应的公钥进行验证匿名的DH,不加认证。会受到中间人攻击然后,指定以下信息加密算法,和类型(流还是分组密码算法)HMAC算法,MD5还是SHA-1是否可出口HashSizeKeyMaterialIVSize第二阶段:服务器认证和密钥交换服务器发送自己的证书,消息包含一个X.509证书,或者一条证书链除了匿名DH之外的密钥交换方法都需要服务器发送server_key_exchange消息可选的,有些情况下可以不需要。只有当服务器的证书没有包含必需的数据的时候才发送此消息消息包含签名,被签名的内容包括两个随机数以及服务器参数服务器发送certificate_request消息非匿名server可以向客户请求一个证书包含证书类型和CAs服务器发送server_hello_done,然后等待应答第三阶段:客户认证和密钥交换客户收到server_done消息后,它根据需要检查服务器提供的证书,并判断server_hello的参数是否可以接受,如果都没有问题的话,发送一个或多个消息给服务器如果服务器请求证书的话,则客户首先发送一个certificate消息,若客户没有证书,则发送一个no_certificate警告然后客户发送client_key_exchange消息,消息的内容取决于密钥交换的类型最后,客户发送一个certificate_verify消息,其中包含一个签名,对从第一条消息以来的所有握手消息的HMAC值(用master_secret)进行签名第四阶段:结束第四阶段建立起一个安全的连接客户发送一个change_cipher_spec