SSL是HTTPS的安全性基础,其目的是让客户端和服务器端相互确认彼此的身份,保证消息的完整性,数据的安全性。
SSL的理论基石是密码学,依据对称加密及非对称加密算法理论,哈希理论,结合一系列设计严密的交互过程,来对SSL协议两端的实体进行相互身份确认,保证数据完整性,防止数据被窃听和篡改。
SSL协议包含两个子协议,一个握手协议,确认身份和协商密钥,一个记录协议,用于消息传输,保证消息的安全性和完整性(一说三个子协议,第三个协议为警报协议,保护协议链接的正确性)。
理论基础
对称加密算法
涉密双方协议一组加解密算法,使用相同的密钥,对所要保护的数据进行加密和解密,当加解密算法或密钥无法被破解,则能保证数据的安全性。当使用的算法越复杂,密钥长度越长,元素越多,数据的安全性越高。一般来说,算法协商过程比密钥协商过程复杂,实际使用过程中,会使用标准对称加密算法,而严格保证密钥的安全性。对称加密算法用于记录协议阶段数据的加密传输。
非对称加密算法
算法过程公开,其数据理论是大素数的乘法计算复杂度远小于其乘积的因式分解,加解密过程使用一对不同的密钥,知道其中任何一方,计算出另一方的可能性几乎为零,我们将其中一个称为私钥,由拥有者唯一知晓,另一个为公钥,为所有人知晓。同样,当密钥长度越长,元素越多,数据安全性越高。同时,非对称加密算法的加密和解密过程比对称加密算法计算复杂度要高得多。非对称加密算法可以用于身份确认,被确认身份方使用自己的私钥对一个确认消息进行加密,密文发送给确认方,确认方使用被确认方的公钥进行解密,确认消息后,则确认来被确认方的身份,同时,被确认方无法否认此确认过程。使用非对称加密算法用于握手协议阶段,确认双方身份及协商记录协议阶段使用的密钥。
哈希理论
哈希产生一个指定长度的字符串,一个好的哈希算法,具有无法回源,碰撞性小的特点。回源,指的是由哈希字符串无法推测原数据的任意子数据集,碰撞性小,指的是任意两个不同数据,经过哈希过程后,产生的字符串相同的概率低。经过哈希算法验证的数据,无法经过更改获得相同的哈希字符串,也无法根据哈希字符串,推测消息的内容。此算法用于对消息的完整性进行验证。
PKI与CA
SSL协议的安全性,其实是从客户端内置的信任根证书开始的,此根证书来自公认权威证书机构颁发,如果客户端的信任根证书被篡改,则无法保证接下来的协议过程的安全性。前面讲过用非对称加密进行身份确认的过程,此过程的安全性前提是,确保公钥与涉密主体的一一对应关系,因此,主体需要向权威机构(CA)申请证书,权威机构使用自己的根证书对申请者的公钥进行签名(相当于为公钥加盖CA的公章,CA需要审核申请者的身份,签名过程将申请者的身份与公钥绑定到一起,当然CA也无法否认此审核过程),赋予有效期,生成申请者的根证书,存放到自己的证书库中,供公开查询和下载,也可将其撤销,申请者持此证书,可宣示其身份。需要注意的是CA的身份也需要得到确认,CA的身份由上一级CA确认,顶级CA的根证书自签名,具有顶级的权威性,这就是PKI的基本结构。客户端的根证书必须来自可信任的CA,在进行SSL握手时,服务端需要出示自己所持的根证书,客户端则可使用信任根证书查询服务端根证书是否来自CA颁发或CA的子级CA颁发,是否在有效期内,是否已被撤销,从而确认服务端的身份的合法性。
客户端在查询服务器端根证书撤销状态时,有两种方式:
- CRL,证书吊销列表,由CA定时发布,客户端定时下载更新到自己本地吊销列表中,对比此列表即可确认服务器根证书的吊销与否。CRL需要增量更新,下载比较麻烦,同时,证书的吊销需要等到CA发布并被客户端下载CRL后才能知道,一般采用第二种方法。
- OCSP,在线证书状态检查协议,客户端按标准发送请求,查询证书状态,CA服务器返回证书状态。
客户端的信任根证书内置在浏览器或操作系统中。
握手协议
握手协议用于请求双方确认彼此身份,并协商记录协议阶段使用的对称加密算法密钥,由于客户端并不需要进行权威审核,因此,握手协议是确定整个会话阶段客户端的身份未更改。
握手协议报文包含三个字段
1 | |---1 byte---|---3 bytes---|---0 bytes---| |
- Type表示握手协议过程中的10种消息类型
- Length报文内容长度
- Content消息内容
握手协议包含四个阶段
协议环境确定
客户端和服务端需要确认彼此支持的算法标准,版本信息等
客户端向服务端发送ClientHello类型消息,消息内容包含
1 客户端可支持的SSL最高版本号
2 用于协商密钥的32字节随机数
3 确定会话的会话ID
4 客户端支持的密码套件列表(算法标准)
5 客户端支持的压缩算法列表
服务端响应客户端的请求,向客户端发送ServerHello类型消息,消息内容包含
1 SSL版本号,由双方共同支持的最高版本号
2 用于协商密钥的32字节随机数
3 会话ID
4 选择客户端支持的密码套件
5 选择客户端支持的压缩算法
此阶段确认双方使用的SSL版本,加解密算法,压缩算法及生成密钥的双方随机数
宣示服务器身份
所有消息均由服务器端发送
- 服务器发送自己的根证书,消息类型为certificate
- 由1阶段确认的加解密算法,发送服务端预确定密钥,消息类型为server_key_exchange
- 发送客户端身份确认请求,由服务端安全性要求确认,可能不发送,消息类型为certificate_request
- 阶段结束消息,表明服务器端消息序列发送完毕,消息类型为server_hello_done
服务器身份确认,宣示客户端身份
所有消息由客户端发送,客户端可对服务端的根证书进行验证
- 根据服务端的要求,发送客户端证书,消息类型为certificate
- 发送客户端预确认密钥,消息类型为client_key_exchange
- 证书确认,向服务端确认验证了其证书,消息类型为certificate_verify
握手完成
生成最终密钥,并结束握手过程
- 客户端改变密码规格值,发送change_cipher_spec消息
- 客户端生成散列值,发送finish消息
- 服务端改变密码规格值,发送change_cipher_spec消息
- 服务端生成散列值,发送finish消息
- 双方根据握手阶段的资料,各自生成相同的密钥。

记录协议1
记录协议过程使用握手阶段确定的加解密和压缩算法及协商确定的密钥,在发送端对所要传输的数据进行分段、压缩,在末尾生成散列值后,对整体进行加密,将密文发送给接收端,接收端解密密文,解析出散列值和明文部分,对明文进行哈希校验,从而保证传输过程种明文的完整性、保密性、不可篡改。
报警协议
当双方发现错误时,向对方发送报警消息,使双方关闭SSL连接,清除会话号,密钥等数据。
安全性建立过程
可以发现,这个协议过程涉及到的过程及基础架构环环相扣,以CA和PKI结构及服务器认证的公开身份为基础,由客户端先确认服务端的身份,并向服务器出示自己的身份来保证整个会话过程的客户端的一致性,从而保证了会话双方的身份,双方以彼此拥有的非对称加密算法密钥对建立的安全通道,传输密钥材料,并在各自本地生成最终密钥,从而保证了记录协议传输阶段的密钥安全性,从而使得对称加密算法的实现有了保障,使用对称加密对加密数据的散列值和明文混合加密传输,实现了明文和散列值的绑定,传输数据的保密性,散列值用于校验,从而保证了消息的完整性。