"SSL"协议对于黑客技术学习,是必须要掌握的,因为它在很多应用通信中无处不在。
"SSL"这个名词,可能大家没怎么听说过,但是它的一个应用大家肯定都熟悉,那就是"HTTPS"!
HTTPS是基于SSL安全连接的HTTP协议。HTTPS通过SSL提供的数据加密、身份验证和消息完整性验证等安全机制,为Web访问提供了安全性保证,广泛应用于网上银行、电子商务等领域。
"SSL"是不是很牛!今天我就给大家以本篇文章内容详细解析一下"SSL"安全协议!
1、基本定义
安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。
2、产生背景
基于因特网的电子商务和网上银行等新兴应用,极大地方便了人们的日常生活,受到人们的青睐。由于这些应用都需要在网络上进行在线交易,它们对网络通 信的安全性提出了更高的要求。
传统的因特网协议HTTP不具备安全机制——采用明文的形式传输数据、不能验证通信双方的身份、无法防止传输的数据被篡改 等,导致HTTP无法满足电子商务和网上银行等应用的安全性要求。
Netscape公司提出的安全协议SSL,利用数据加密、身份验证和消息完整性验证机制,为网络上数据的传输提供安全性保证。SSL可以为HTTP提供安全连接,从而很大程度上改善了因特网的安全性问题
3、SSL技术优点与不足
优点:
1) 提供较高的安全性保证
SSL利用数据加密、身份验证和消息完整性验证机制,保证网络上数据传输的安全性。
2) 支持各种应用层协议。
虽然SSL设计的初衷是为了解决万维网安全性问题,但是由于SSL位于应用层和传输层之间,它可以为任何基于TCP等可靠连接的应用层协议提供安全性保证。
3) 部署简单。
目前SSL已经成为网络中用来鉴别网站和网页浏览者身份,在浏览器使用者及Web服务器之间进行加密通信的全球化标准。SSL协议已被集成到大部分的浏览器中,如IE、Netscape、Firefox等。这就意味着几乎任意一台装有浏览器的计算机都支持SSL连接,不需要安装额外的客户端软件。
SSL协议的不足:
1)SSL要求对每个数据进行加密和解密操作,因而在带来高性能的同时,对系统也要求高资源开销。
2)SSL协议主要是使用公开密钥体制和X.509数字证书技术保护信息传输的机密性和完整性,它不能保证信息的不可抵赖性,主要适用于点对点之间的信息传输,常用Web Server方式。3)SSL为带有安全功能的TCP/IP套接字应用程序接口提供了一个替代的方法,理论上,在SSL之上可以安全方式运行任何原有TCP/IP应用程序而不需修改,但实际上,SSL目前还只是用在HTTP连接上。
1、SSL协议所处的位置
SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传
递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头。
如上图所示,SSL位于应用层和传输层之间,它可以为任何基于TCP等可靠连接的应用层协议提供安全性保证。SSL协议本身分为两层:
上层为SSL握手协议(SSL handshake protocol)、SSL密码变化协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol)
底层为SSL记录协议(SSL record protocol)。
其中:
SSL握手协议:是SSL协议非常重要的组成部分,用来协商通信过程中使用的加密套件(加密算法、密钥交换算法和MAC算法等)、在服务器和客户端之间安全地交换密钥、实现服务器和客户端的身份验证。
SSL密码变化协议:客户端和服务器端通过密码变化协议通知对端,随后的报文都将使用新协商的加密套件和密钥进行保护和传输。
SSL警告协议:用来向通信对端报告告警信息,消息中包含告警的严重级别和描述。
SSL记录协议:主要负责对上层的数据(SSL握手协议、SSL密码变化协议、SSL警告协议和应用层协议报文)进行分块、计算并添加MAC值、加密,并把处理后的记录块传输给对端。
2、协议安全机制
1) 传输数据的机密性
网络上传输的数据非常容易被非法用户窃取,SSL采用在通信两方之间建立加密通道的方法保证传输数据的机密性。
所谓加密通道,是指发送方在发送数据前,使用加密算法和加密密钥对数据进行加密,然后将数据发送给对方。接收方接收到数据后,利用解密算法和解密密钥从密文中获取明文。没有解密密钥的第三方,无法将密文恢复为明文,从而保 证传输数据的机密性。
SSL加密通道上的数据加解密使用对称密钥算法,主要支持的算法有DES、3DES、AES等,这些算法都能够有效地防止交互数据被窃听。
2) 身份验证机制
电子商务和网上银行等应用中必须保证要登录的Web服务器是真实的,以免重要信息被非法窃取。SSL利用数字签名来验证通信对端的身份。
非对称密钥算法可以用来实现数字签名。由于通过私钥加密后的数据只能利用对应的公钥进行解密,因此根据解密是否成功,就可以判断发送者的身份,如同发送者对数据进行了"签名"。
SSL客户端必须验证SSL服务器的身份,SSL服务器是否验证SSL客户端的身份,则由SSL服务器决定。
使用数字签名验证身份时,需要确保被验证者的公钥是真实的,否则,非法用户可能会冒充被验证者与验证者通信。如下图所示,Cindy冒充Bob,将自己的公钥发给Alice,并利用自己的私钥计算出签名发送给Alice,Alice利用"Bob"的公钥(实际上为Cindy的公钥)成功验证该签名,则Alice认为Bob的身份验证成功,而实际上与Alice通信的是冒充Bob的Cindy。SSL利用PKI提供的机制保证公钥的真实性。PKI技术在我之前的文章里有详细阐述。
3) 消息完整性验证
为了避免网络中传输的数据被非法篡改,SSL利用基于MD5或SHA的MAC算法来保证消息的完整性。
MAC算法是在密钥参与下的数据摘要算法,能将密钥和随意长度的数据转换为固定长度的数据。利用MAC算法验证消息完整性的过程如下图所看到的。
发送者在密钥的参与下,利用MAC算法计算出消息的MAC值。并将其加在消息之后发送给接收者。接收者利用相同的密钥和MAC算法计算出消息的MAC值。并与接收到的MAC值比較。假设二者相同。则报文没有改变;否则,报文在传输过程中被改动,接收者将丢弃该报文。
MAC算法具有如以下特征,使其可以用来验证消息的完整性:
消息的不论什么改变,都会引起输出的固定长度数据产生变化。通过比較MAC值,可以保证接收者可以发现消息的改变。
MAC算法须要密钥的參与。因此没有密钥的非法用户在改变消息的内容后,无法加入正确的MAC值。从而保证非法用户无法任意改动消息内容。
3、SSL协议握手过程
SSL通过握手过程在客户端和服务器之间协商会话参数,并建立会话。会话包含的主要参数有会话ID、对方的证书、加密套件(密钥交换算法、数据加密算法和MAC算法等)以及主密钥(master secret)。通过SSL会话传输的数据,都将采用该会话的主密钥和加密套件进行加密、计算MAC等处理。
不同情况下,SSL握手过程存在差异。下面将分别描述以下三种情况下的握手过程:
1) 只验证服务器的SSL握手过程
过程如下:
(1) SSL客户端通过Client Hello消息将它支持的SSL版本、加密算法、密钥交换算法、MAC算法等信息发送给SSL服务器。
(2) SSL服务器确定本次通信采用的SSL版本和加密套件,并通过Server Hello消息通知给SSL客户端。如果SSL服务器允许SSL客户端在以后的通信中重用本次会话,则SSL服务器会为本次会话分配会话ID,并通过Server Hello消息发送给SSL客户端。
(3) SSL服务器将携带自己公钥信息的数字证书通过Certificate消息发送给SSL客户端。
(4) SSL服务器发送Server Hello Done消息,通知SSL客户端版本和加密套件协商结束,开始进行密钥交换。
(5) SSL客户端验证SSL服务器的证书合法后,利用证书中的公钥加密SSL客户端随机生成的premaster secret,并通过Client Key Exchange消息发送给SSL服务器。
(6) SSL客户端发送Change Cipher Spec消息,通知SSL服务器后续报文将采用协商好的密钥和加密套件进行加密和MAC计算。
(7) SSL客户端计算已交互的握手消息(除Change Cipher Spec消息外所有已交互的消息)的Hash值,利用协商好的密钥和加密套件处理Hash值(计算并添加MAC值、加密等),并通过Finished消息发送给SSL服务器。SSL服务器利用同样的方法计算已交互的握手消息的Hash值,并与Finished消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功。
(8) 同样地,SSL服务器发送Change Cipher Spec消息,通知SSL客户端后续报文将采用协商好的密钥和加密套件进行加密和MAC计算。
(9) SSL服务器计算已交互的握手消息的Hash值,利用协商好的密钥和加密套件处理Hash值(计算并添加MAC值、加密等),并通过Finished消息发送给SSL客户端。SSL客户端利用同样的方法计算已交互的握手消息的Hash值,并与Finished消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功。
SSL客户端接收到SSL服务器发送的Finished消息后,如果解密成功,则可以判断SSL服务器是数字证书的拥有者,即SSL服务器身份验证成功,因为只有拥有私钥的SSL服务器才能从Client Key Exchange消息中解密得到premaster secret,从而间接地实现了SSL客户端对SSL服务器的身份验证。
2) 验证服务器和客户端的SSL握手过程
过程如下:
(1) SSL服务器发送Certificate Request消息,请求SSL客户端将其证书发送给SSL服务器。
(2) SSL客户端通过Certificate消息将携带自己公钥的证书发送给SSL服务器。SSL服务器验证该证书的合法性。
(3) SSL客户端计算已交互的握手消息、主密钥的Hash值,利用自己的私钥对其进行加密,并通过Certificate Verify消息发送给SSL服务器。
(4) SSL服务器计算已交互的握手消息、主密钥的Hash值,利用SSL客户端证书中的公钥解密Certificate Verify消息,并将解密结果与计算出的Hash值比较。如果二者相同,则SSL客户端身份验证成功。
3) 恢复原有会话的SSL握手过程
(1) SSL客户端发送Client Hello消息,消息中的会话ID设置为计划重用的会话的ID。
(2) SSL服务器如果允许重用该会话,则通过在Server Hello消息中设置相同的会话ID来应答。这样,SSL客户端和SSL服务器就可以利用原有会话的密钥和加密套件,不必重新协商。
(3) SSL客户端发送Change Cipher Spec消息,通知SSL服务器后续报文将采用原有会话的密钥和加密套件进行加密和MAC计算。
(4) SSL客户端计算已交互的握手消息的Hash值,利用原有会话的密钥和加密套件处理Hash值,并通过Finished消息发送给SSL服务器,以便SSL服务器判断密钥和加密套件是否正确。
(5) 同样地,SSL服务器发送Change Cipher Spec消息,通知SSL客户端后续报文将采用原有会话的密钥和加密套件进行加密和MAC计算。
(6) SSL服务器计算已交互的握手消息的Hash值,利用原有会话的密钥和加密套件处理Hash值,并通过Finished消息发送给SSL客户端,以便SSL客户端判断密钥和加密套件是否正确
4、利用抓包工具直观分析SSL握手连接过程
下面从抓包数据来具体分析这一过程并说明各部分数据的作用以及如实现前面列出的握手的目标,当然了,最重要的还是说明为何这一过程是安全可靠的,第三方无法截获,篡改或者假冒。
SSL一次请求与响应整体流程图:
1) client发送ClientHello
每一条消息都会包含有ContentType,Version,HandshakeType等信息。
2) server回应ServerHello
这里多了个session id,如果SSL连接断开,再次连接时,可以使用该属性重新建立连接,在双方都有缓存的情况下可以省略握手的步骤。
server端也会生成随机的RN,用于生成session key使用。
server会从client发送的Cipher suite列表中跳出一个,这里挑选的是RSA+RC4+MD5
这次server共发送的3个handshake 消息:Serverhello,Certificate和ServerHelloDone,共用一个ContentType:Handshake
3) server发送Certificate
server的证书信息,只包含public key,server将该public key对应的private key保存好,用于证明server是该证书的实际拥有者,那么如何验证呢?原理很简单:client随机生成一串数,用server这里的public key加密(显然是RSA算法),发给server,server用private key解密后返回给client,client与原文比较,如果一致,则说明server拥有private key,也就说明与client通信的正是证书的拥有者,因为public key加密的数据,只有private key才能解密,目前的技术还没发破解。利用这个原理,也能实现session key的交换,加密前的那串随机数就可用作session key,因为除了client和server,没有第三方能获得该数据了。原理很简单,实际使用时会复杂很多,数据经过多次hash,伪随机等的运算,前面提到的client和server端得RN都会参与计算。
4) Server发送ServerHelloDone
5) Client发送ClientKeyExchange
client拿到server的certificate后,就可以开始利用certificate里的public key进行session key的交换了。从图中可以看出,client发送的是130字节的字节流,显然是加过密的。client随机生成48字节的Pre-mastersecret,padding后用public key加密就得到这130字节的数据发送给server,server解密也能得到Pre-mastersecret。双方使用pre-master secret, "mastersecret"常量字节流,前期交换的server端RN和client的RN作为参数,使用一个伪随机函数PRF,其实就是hash之后再hash,最后得到48字节的master secret。master secret再与"key expansion"常量,双方RN经过伪随机函数运算得到key_block,PRF伪随机函数可以可以仿佛循环输出数据,因此我们想得到多少字节都可以,就如Random伪随机函数,给它一个种子,后续用hash计算能得到无数个随机数,如果每次种子相同,得到的序列是一样的,但是这里的输入时48字节的master secret,2个28字节的RN和一个字符串常量,碰撞的可能性是很小的。得到key block后,算法,就从中取出session key,IV(对称算法中使用的初始化向量)等。client和server使用的session key是不一样的,但只要双方都知道对方使用的是什么就行了。这里会取出4个:client/server加密正文的key,client/server计算handshake数据hash的key。
6) Client发送ChangeCipherSpec
client指示Server从现在开始发送的消息都是加密过的。
7) 7.Client发送Finished
client发送的加密数据,这个消息非常关键,一是能证明握手数据没有被篡改过,二也能证明自己确实是密钥的拥有者(这里是单边验证,只有server有certificate,server发送的Finished能证明自己含有private key,原理是一样的)。client将之前发送的所有握手消息存入handshakemessages缓存,进行MD5和SHA-1两种hash运算,再与前面的master secret和一串常量"client finished"进行PRF伪随机运算得到12字节的verify data,还要经过改进的MD5计算得到加密信息。为什么能证明上述两点呢,前面说了只有密钥的拥有者才能解密得到pre-master key,master key,最后得到key block后,进行hash运算得到的结果才与发送方的一致。
8) Server发送ChangeCipherSpec
Server指示client从现在开始发送的消息都是加密过的。
9) Server发送Finishd
与client发送Finished计算方法一致。server发送的Finished里包含hash给client,client会进行校验,如果通过,说明握手过程中的数据没有被第三方篡改过,也说明server是之前交换证书的拥有者。现在双方就可以开始后续通信,进入Application context了。
SSL协议主要应用于"HTTPS"和"SSL VPN"两大场景。
HTTPS通过SSL提供的数据加密、身份验证和消息完整性验证等安全机制,为Web访问提供了安全性保证。
例如某银行为了方便客户,提供了网上银行业务,客户可以通过访问银行的Web服务器进行帐户查询、转帐等。通过在客户和银行的Web服务器之间建立SSL连接,可以保证客户的信息不被非法窃取
SSL VPN是以SSL为基础的VPN技术,利用SSL提供的安全机制,为用户远程访问公司内部网络提供了安全保证。SSL VPN通过在远程接入用户和SSL VPN网关之间建立SSL安全连接,允许用户通过各种Web浏览器,各种网络接入方式,在任何地方远程访问企业网络资源,并能够保证企业网络的安全,保护企业内部信息不被窃取。
安全套接层(SSL)被用于保护无数的网络用户,但是它有什么弱点呢?最近几年出现了许多专门攻击SSL的攻击。虽然这个技术实际上还是比较安全的,但是攻击者一直在寻找漏洞绕过安全协议和标准。其中SSL是他们的主要目标。SSL被用于保护敏感的超文本传输协议(HTTP)流量。有一些攻击者则不这样想,他们一直在寻找访问敏感数据的新方法。
下面主要介绍常见"SSL"攻击方法:
1、欺骗手段
欺骗用户接入一个错误的证书。这是一种攻击SSL用户的常用方法。其方法是让用户不顾看到的警告或错误,仍然坚持访问这个网站。虽然发起这种攻击很简单,但是它要求受攻击者接受一个明显有问题的证书。大多数用户都会发现这种欺骗行为;因此,这种威胁的级别较低。
2、虚假证书
虽然这种方法听起来有一些牵强,但是它曾经取得成功。有时攻击者能够获得一个有效的证书,然后用它们执行恶意行为。例如,在2011年,有攻击者攻破了荷兰证书授权的安全机制,然后伪造了雅虎、谷歌、Wordpress等网站的证书。在获得有效的证书之后,这些攻击者绕过了HTTPS保护。但是,这种攻击的整体级别仍然比较低。
3、移除SSL,直接通过明文发送数据
2009年出现了一种新的SSL攻击方法,它来自于SSLStrip。这个工具不会让用户看到警告信息,而是充当一个代理服务器的作用,去掉了HTTPS的S(安全性),这样用户就只能通过HTTP直接访问。SSLStrip还允许攻击者给用户看到加锁网站图标,所以发现错误的唯一方法就是浏览器地址栏只显示HTTP,而不是HTTPS。如果用户没有注意到这个细微差别,那么攻击者就可以访问到受保护的数据。这种攻击的威胁级别属于中级。
4、破解密钥
目前大多数证书都使用1024位或2048位密钥。2048位密钥非常可靠,想要使用一台普通桌面电脑来暴力破解它,这几乎是不可能的。即使如此,已经有报告指出,National Security Agency已经成功获得了SSL流量的访问。虽然有人认为NSA可能发现了新的量子计算技术,但是这个机构完全有可能直接获得了加密密钥或者在软件和硬件中植入了后门(入口)。NSA及其他访问安全数据的方法的威胁级别还不确定。
5、中间人攻击
这种攻击是一种主动窃听形式,攻击者将通过独立连接访问攻击目标,然后向服务器发送信息。其中一个例子就是Lucky 13,它是用传输层安全媒体访问控制计算的13位头信息命名的。虽然这种密文攻击在理论上是可能实现的,但是它要求先控制环境,而且需要很长的时间;所以,它的威胁级别非常低。
6、边信道攻击
过去几年出现了几次边信道攻击,它已经证明可用于恢复验证所使用的HTTP请求和Cookies。 通过适应性超文本压缩实现的浏览器侦测和泄漏(BREACH)就是一个例子。BREACH利用压缩和HTPP响应,它们一般都使用gzip等机制压缩。对于可能受到攻击的应用,它必须使用HTTP级压缩,在HTTP响应中加入用户输入,然后暴露HTTP响应体的跨站请求伪造令牌。虽然这在理论上是可行的,但是有一些方法可以抑制这种攻击,因此它的威胁级别也较低。
7、Downgrade(降级攻击)
降级攻击是一种对计算机系统或者通信协议的攻击,在降级攻击中,攻击者故意使系统放弃新式、安全性高的工作方式,反而使用为向下兼容而准备的老式、安全性差的工作方式,降级攻击常被用于中间人攻击,讲加密的通信协议安全性大幅削弱,得以进行原本不可能做到的攻击。 在现代的回退防御中,使用单独的信号套件来指示自愿降级行为,需要理解该信号并支持更高协议版本的服务器来终止协商,该套件是TLS_FALLBACK_SCSV(0x5600)
8、CRIME(罪恶攻击)
CRIME(CVE-2012-4929),全称Compression Ratio Info-leak Made Easy,这是一种因SSL压缩造成的安全隐患,通过它可窃取启用数据压缩特性的HTTPS或SPDY协议传输的私密Web Cookie。在成功读取身份验证Cookie后,攻击者可以实行会话劫持和发动进一步攻击。
SSL 压缩在下述版本是默认关闭的: nginx 1.1.6及更高/1.0.9及更高(如果使用了 OpenSSL 1.0.0及更高), nginx 1.3.2及更高/1.2.2及更高(如果使用较旧版本的 OpenSSL)。
如果你使用一个早期版本的 nginx 或 OpenSSL,而且你的发行版没有向后移植该选项,那么你需要重新编译没有一个 ZLIB 支持的 OpenSSL。这会禁止 OpenSSL 使用 DEFLATE 压缩方式。如果你禁用了这个,你仍然可以使用常规的 HTML DEFLATE 压缩。
9、Heartbleed(心血漏洞)
Heartbleed(CVE-2014-0160) 是一个于2014年4月公布的 OpenSSL 加密库的漏洞,它是一个被广泛使用的传输层安全(TLS)协议的实现。无论是服务器端还是客户端在 TLS 中使用了有缺陷的 OpenSSL,都可以被利用该缺陷。由于它是因 DTLS 心跳扩展(RFC 6520)中的输入验证不正确(缺少了边界检查)而导致的,所以该漏洞根据"心跳"而命名。这个漏洞是一种缓存区超读漏洞,它可以读取到本不应该读取的数据。如果使用带缺陷的Openssl版本,无论是服务器还是客户端,都可能因此受到攻击。
10、POODLE漏洞(卷毛狗攻击)
2014年10月14号由Google发现的POODLE漏洞,全称是Padding Oracle On Downloaded Legacy Encryption vulnerability,又被称为"贵宾犬攻击"(CVE-2014-3566),POODLE漏洞只对CBC模式的明文进行了身份验证,但是没有对填充字节进行完整性验证,攻击者窃取采用SSL3.0版加密通信过程中的内容,对填充字节修改并且利用预置填充来恢复加密内容,以达到攻击目的。
11、TLS POODLE(TLS卷毛狗攻击)
TLS POODLE(CVE-2014-8730) 该漏洞的原理和POODLE漏洞的原理一致,但不是SSL3协议。由于TLS填充是SSLv3的一个子集,因此可以重新使用针对TLS的POODLE攻击。TLS对于它的填充格式是非常严格的,但是一些TLS实现在解密之后不执行填充结构的检查。即使使用TLS也不会容易受到POODLE攻击的影响。
12、DROWN(溺水攻击/溺亡攻击)
2016年3月发现的针对TLS的新漏洞攻击——DROWN(Decrypting RSA with Obsolete and Weakened eNcryption,CVE-2016-0800),也即利用过时的、弱化的一种RSA加密算法来解密破解TLS协议中被该算法加密的会话密钥。 具体说来,DROWN漏洞可以利用过时的SSLv2协议来解密与之共享相同RSA私钥的TLS协议所保护的流量。 DROWN攻击依赖于SSLv2协议的设计缺陷以及知名的Bleichenbacher攻击。