概览
安全套接字层 (SSL) 是一种加密安全协议。它最初由 Netscape 于 1995 年开发,旨在确保 Internet 通信中的隐私、身份验证和数据完整性。SSL 是如今使用的现代 TLS 加密的前身。
实施 SSL/TLS 的网站的 URL 中带有“HTTPS”,而不是“HTTP”。
握手协议
Client Hello:
客户端会先向服务器发送一个名为Client Hello的请求,这条请求包含一条信息 并 初始化一个session。这条信息包括:
版本号 (Version Number): 客户端最高支持的版本号。也就是使用SSL/TLS传输协议的版本。例如:Version 2 表示使用 SSL 2.0,Version 3 表示使用 SSL 3.0。
随机生成的数据 第一个随机数(Randomly Generated Data)[32byte]:包括4btye的时间戳,加上28byte的随机生成的数字,用于发送给服务器。
session id (Session Identification):用来给标识客户端与服务器之间的会话信息。
密码套件 (Cipher Suite):客户端支持的加密算法。
压缩算法 (Compression Algorithm) :客户端支持的压缩算法(可以为none)
Server Hello:
服务器接收到请求后,立即向客户端发送多个响应。
响应1
服务器返回给客户端的消息,这条消息包括:
版本号 (Version Number):服务器和浏览器双方都支持的最高版本 的SSL/TLS。
随机生成的数据第二个随机数 (Randomly Generated Data)[32byte]:包括4btye的时间戳,加上28byte的随机生成的数字,用于发送给客户端。
session id (Session Identification):有以下三种情况。
-
创建一个新session,并返回session id——当客户端发送的消息中,没有Session Identification 这一项。或者,服务器中没有一个session的session id 与之匹配时。
-
一个与客户端发送的消息中的session id匹配的session id;也就是客户端发送过来的session id;
-
Null——这是一个新的session, 但是服务器不愿意把session id 发送给客户端。
密码套件 (Cipher Suite):服务器会从客户端支持的密码套件中,选择一个服务器,客户端双方都支持的、最健壮的密码套件。如果没有合适的密码套件,会话就会结束。这里以主流的RSA 加密算法为例介绍。
压缩算法 (Compression Algorithm) :一个将要被使用的压缩算法(可以为none,即不压缩)
响应2
服务器证书 (Server Certificate) : 服务器会将自己的证书发送给客户端,这个服务器证书中包含了服务器的公匙,客户端将使用此公钥对服务器进行身份验证并加密预主密钥。
同时证书中还包含了服务器信任列表,来告诉客户端哪些服务器是可信的。
响应3
服务器密钥(Server Key Exchange): 这一步是可选的。服务器会发送一个临时的密钥给客户端,用来让客户端加密发送给服务器的客户端密钥信息。这一步仅当服务器没有提供公匙让客户端加密客户端密匙信息时。才会进行,例如:当服务器证书中没有包含公匙。
响应4
请求客户端证书(Client Certificate Request) : 这一步也是可选的。如果服务器也需要客户端的证书,就会发送这个请求。主要是为了确认这个客户端,是否是可信任的客户端。
响应5
服务器响应结束(Server Hello Done): 告诉客户端,服务器响应结束。
Client Response to Server
客户端响应来自服务器的响应^_^
响应1
客户端证书(Client Certificate):如果服务器请求了客户端证书(Client Certificate Request);就会向服务器发送这个证书,这个证书中包含了客户端的公钥。
响应2
客户端密钥(Client Key Exchange): 客户端生成第三个随机数称为预主密钥,预主密钥经过服务器发来的公钥加密后,发送给服务器。服务器接收到数据后,经过私钥解密,就得到了预主密钥。
在这一步,客户端必须发送使用的SSL/TLS的版本,以便让服务器核对与先前服务器给客户端发送的SSL/TLS版本是否一致。这是为了防止人为的篡改客户端、服务器使用不安全的SSL/TLS版本。
响应3
证书验证(Certificate Verify):仅当客户端先前发送了客户端证书消息时才会发送此消息。 客户端通过使用其私钥对之前所有消息的哈希值进行签名来进行身份验证。 接收者使用签名者的公钥验证签名,从而确保它是使用客户端的私钥签名的
响应4
更改加密规范(Change Cipher Spec): 这条消息用来通知服务器,以后的所有信息,都会按照之前约定的加密规范进行加密。
响应5
客户端响应结束(Client Finished):通知服务器,客户端响应结束。
Server Final Response to Client
服务器最后的确认响应
响应1
改变加密规范消息(Change Cipher Spec Message):这条消息告诉客户端,服务器已经准备好了用刚才协商好的密钥解密消息。
响应2
服务器完成响应(Server Finished Message) :这条消息包含了在此之前与客户端交流的所有消息,并进行加密,如果客户端成功解密了消息,SSL/TLS 握手完成。
总的过程就像下图展示的那样。
警报子协议(The Alter Sub-Protocol)
警报信息参照表
Alert Message | Fatal? | Description |
---|---|---|
unexpected_message | Yes | Inappropriate message |
bad_record_mac | Yes | Incorrect MAC |
decryption_failed | Yes | Unable to decrypt TLSCiphertext correctly |
record_overflow | Yes | Record is more than 2^14+1024 bytes |
handshake_failure | Yes | Unacceptable security parameters |
bad_certificate | Yes | There is a problem with the Certificate |
unsupported_certificate | No | Certificate is unsupported |
certificate_revoked | No | Certificate has been revoked |
certificate_expired | No | Certificate has expired |
certificate_unknown | No | Certificate is unknown |
illegal_parameter | Yes | Security parameters violated |
unknown_ca | Yes | CA unknown |
access_denied | Yes | Sender does not want to negotiate |
decode_error | Yes | Unable to decode message |
decrypt_error | Yes | Handshake cryptographic operation failed |
export_restriction | Yes | Not in compliance with export regulations |
protocol_version | Yes | Protocol version not supported by both parties |
insufficient_security | Yes | Security requirements no met |
internal_error | Yes | Error not related to protocol |
user_canceled | Yes | Not related to protocol failure |
no_renegotiation | No | Negotiation request rejected. |
纪录协议(The Recode Protocol)
记录层除了从应用层接受数据外还做了以下这些事情。
-
将数据分成小块,或者讲小块数据恢复到原来的结构。
-
将数据序列的数据块排序,防止数据因遭受到攻击而重新排列。
-
用在握手协议中约定好的压缩算法,对数据压缩或解压缩。
-
用在握手协议中约定好的加算法,对数据加密或解密。
-
检查数据的完整性。
一旦纪录协议完成了对数据的操作,它就会把数据发送给TCP/IP 传输层进行传输。如果是传入数据,就把数据发送给合适的应用进程进行接受。