SSL从理论到实践(二)——SSL

1.SSL介绍

  SSL(Secure Sockets Layer 安全套接字层)是为网络通信提供安全及数据完整性的一种安全协议。SSL最初的几个版本(SSL 1.0、SSL2.0、SSL 3.0)由网景公司设计和维护,从3.1版本开始,SSL协议由因特网工程任务小组(IETF)正式接管,并更名为TLS(Transport Layer Security),发展至今已有TLS 1.0、TLS1.1、TLS1.2这几个版本。虽然目前我们使用的大部分都是TLS,但由于习惯问题,我们还是叫“SSL”比较多(题外话:想起了MSF和恭喜WE…)。

2.SSL的位置

  TLS与SSL都是在传输层对网络连接进行加密。顺便说一句,加密连接几乎都是依靠传输层的(不管是什么样的加密),加密过程也是在传输层上完成的。

3.SSL中的子协议

  SSL/TLS协议有一个高度模块化的架构,分为很多子协议,如下图所示:
在这里插入图片描述
  握手协议(Handshake protocol):包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换;
  改变密码规格协议(ChangeCipherSpec protocol):告知对方在后续的通信中使用加密模式 ;
  告警协议(Alert protocol):对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型的错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告;
  记录协议(Record protocol):包括对消息的分段、压缩、消息认证和完整性保护、加密等。
  四个协议之间的关系:首先是进行握手,握手协议中出现异常则执行告警协议,对于warning级别的错误给出警告,对fatal类型的错误直接中断SSL链接。生成会话密钥后发送ChangeCipherSpec来告知对方在后续的通信中更改加密方式,接着使用记录协议在Tcp的帮助下负责传输数据。

4.握手协议流程详解

  握手协议是客户机和服务器用SSL连接通信时使用的第一个子协议,握手协议包括客户机与服务器之间的一系列消息。SSL中最复杂的协议就是握手协议。握手过程的主要功能是协商密码套件、进行身份认证以及密钥交换(SSL中使用非对称加密来加密密钥,使用对称加密来传输数据,所以有密钥交换的过程)。
  握手过程中的消息必须严格按照预先定义的顺序发生,否则就会带来潜在的安全威胁。
  一个典型的SSL协议交互流程如下图所示:
在这里插入图片描述
  其中从ClientHello至Application Data之前为握手协议的流程。握手协议过程中可以分为四个阶段:建立安全能力(ClientHello和ServerHello)、服务器鉴别与密钥交换(服务端Certificate、ServerKeyExchange、CertificateRequest和ServerHelloDone )、客户机鉴别与密钥交换(客户端Certificate、ClientKeyExchange和CertificateVerify)和完成阶段(客户端ChangeCipherSpec、客户端Finished、服务端ChangeCipherSpec和服务端Finished)。

4.1 建立安全能力——ClientHello和ServerHello

首先由客户端向服务器发出ClientHello消息并等待服务器响应。ClientHello中包含以下内容:

  • version:客户端可以支持的SSL/TLS协议的最高版本号。
  • random:客户端生成的随机数。这个随机数由4个字节的当前GMT UNIX时间以及28个随机选择的字节组成,共32字节。该随机数会在密钥生成过程中被使用。
  • session_id:确定会话的会话ID。
  • cipher_suites:客户端可以支持的密码套件列表(密码套件格式:每个套件以“SSL”或“TLS”开头,紧跟着的是密钥交换算法。用“With”这个词把密钥交换算法、加密算法、数据摘要算法分开,例如:SSL_DHE_RSA_WITH_DES_CBC_SHA,表示把DHE_RSA(带有RSA数字签名的暂时Diffie-HellMan)定义为密钥交换算法;把DES_CBC定义为加密算法;把SHA定义为数据摘要算法)。
  • compression_methods:客户端可以支持的压缩算法列表。

服务器接受到ClientHello后,会返回ServerHello。ServerHello中包含以下内容:

  • server_version:确定使用SSL协议的版本号。取客户端支持的最高版本号和服务端支持的最高版本号中的较低者(如果客户端没有传递版本号会直接报wrong version number的错误,并中止连接)。
  • random:服务端生成的随机数,与客户端的生成方式一致,4+28字节。(注意,目前有了两个随机数,客户端生成一个发给了服务端,服务端生成了一个发给客户端,在最后的密钥生成过程中会使用这两个随机数)
  • session_id:确定会话的会话ID。
  • cipher_suite:从客户端的密码套件列表中选择的一个密码套件(如果客户端发送的密码套件列表服务端都不支持,则会报no shared cipher错误,并中止连接)。
  • compression_method:从客户端的压缩方法的列表中选择的压缩方法。

这两条消息发送完成之后,客户端和服务端都知道了下列内容:

  • SSL版本。
  • 使用哪个密码套件,即密钥交换算法、加密算法和数据摘要算法。
  • 压缩方法。
  • 有关密钥生成的两个随机数。
4.2 服务器鉴别与密钥交换——Certificate、ServerKeyExchange、CertificateRequest和ServerHelloDone
  • Certificate (证书):发送服务器的证书。Certificate消息中会包含一条证书链,从服务器证书开始,到Certificate authority(CA)或者最新的自签名证书结束。
  • ServerKeyExchange(服务器密钥交换):此条消息的发送视密钥交换算法而定。如果是DH算法,这里发送服务器使用的DH参数。RSA算法不需要这一步。
  • CertificateRequest(证书请求):要求客户端提供证书,需要双向认证时才会发送此消息。消息中包含了证书类型以及可接受的CA列表。
  • ServerHelloDone:服务器发送这条消息表明服务器部分的密钥交换信息已经发送完了,等待客户端的消息以继续接下来的步骤。这条消息只用作提醒,不包含实际内容。
4.3 客户机鉴别与密钥交换——Certificate、ClientKeyExchange和CertificateVerify
  • Certificate(证书):与服务端的CertificateRequest对应,发送客户端证书,服务端要求双向认证时才会发送此消息。消息中包含了证书类型以及可接受的CA列表。
  • ClientKeyExchange(客户端密钥交换):与ServerKeyExchange对应,此条消息发送的内容取决于所使用的密钥交换算法。如果是DH算法,这里发送的就是客户端的DH参数,之后服务器和客户端根据DH算法,各自计算出相同的PreMasterSecret。如果是采用RSA算法,会生成一个48字节随机数(前2个字节表示客户端支持的最高协议版本,后46个字节是随机选择的)作为PreMasterSecret,然后用服务端的公钥加密之后再发送给服务端。
  • CertificateVerify(证书验证):服务端要求双向验证时才会发此消息,此消息用来证明客户端拥有之前提交的客户端证书的私钥。

  此时客户端与服务端就能利用三个随机数(client random、server random、PreMasterSecret)根据约定好的加密算法分别算出一个会话密钥(session key),一般情况下是128位或者256位。握手协议完成后客户端与服务器端通信信息的加密就会使用该会话密钥。(实际生成会话密钥的过程比这复杂的多,有兴趣的同学可以自己查阅相关资料)

4.4 完成握手协议——客户端ChangeCipherSpec、客户端Finished、服务端ChangeCipherSpec和服务端Finished。
  • 客户端ChangeCipherSpec:客户端要求服务器在后续的通信中使用加密模式。
  • 客户端Finished:客户端使用会话密钥发送的第一个加密报文,告诉服务端已经准备好安全通信了。
  • 服务端ChangeCipherSpec:服务器要求客户端在后续的通信中使用加密模式。
  • 服务端Finished:服务端使用会话密钥发送的第一个加密报文,告诉客户端已经准备好安全通信了。SSL握手完成的标志。
5.常见的SSL/TLS实现

OpenSSL: 最常用的开源SSL/TLS实现。理论上SSL是安全的,但SSL的实现就可能有些漏洞,比如openssl之前曝出的著名的“心脏出血”。
JSSE:这是使用Java实现的,支持SSL 3.0,TLS 1.0/1.1/1.2。
Bouncy Castle:它不仅仅支持SSL/TLS,还是一个完整的密码学库,支持各种密码学算法和协议。Android平台主要使用这个密码学库。

6.简单总结

  至此SSL的原理介绍完毕,接下来本该介绍SSL在各个平台上的实现,但在代码的实现过程中我们会碰到各种与证书相关的概念以及各种格式的文件,所以下一步让我们先理清这些概念与文件的含义。
  好了,关于SSL的概念就介绍到这,接下来我们来介绍一下证书文件的相关知识:SSL从理论到实践(三)——证书文件

参考

1.SSL协议详解
2.让SSL/TLS协议流行起来:深度解读SSL/TLS实现
3.使用wireshark观察SSL/TLS握手过程–双向认证/单向认证
4.Android 6.0 SSL通信
5.SSL/TLS的原理以及互联网究竟是如何工作的(1-5)
6.JDK 中的证书生成和管理工具 keytool
7.那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值