zoukankan      html  css  js  c++  java
  • 通信与网络安全之SSL

    1.SSL
    SSL:(Secure Socket Layer,安全套接字层),为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。
    1.1.SSL的特性
    数据传输的机密性:SSL加密通道上的数据加解密使用对称密钥算法,目前主要支持的算法有DES、3DES、AES等,这些算法都可以有效地防止交互数据被窃听。
    身份验证机制:使用数字签名技术,SSL客户端必须验证SSL服务器的身份,SSL服务器是否验证SSL客户端的身份,则由SSL服务器决定。
    消息完整性验证:SSL利用基于MD5或SHA的MAC算法来保证消息的完整性。利用非对称密钥算法保证密钥本身的安全。SSL通常采用RSA算法加密传输密钥(非对称密钥)
    实际上,SSL客户端发送给SSL服务器的密钥不能直接用来加密数据或计算MAC值,该密钥是用来计算对称密钥和MAC密钥的信息,称为premaster secret。SSL客户端和SSL服务器利用premaster secret计算出相同的主密钥(master secret),再利用master secret生成用于对称密钥算法、MAC算法等的密钥。premaster secret是计算对称密钥、MAC算法密钥的关键。
    SSL利用PKI提供的机制保证公钥的真实性:验证SSL服务器/SSL客户端的身份之前,SSL服务器/SSL客户端需要将从CA获取的证书发送给对端,对端通过PKI判断该证书的真实性。如果该证书确实属于SSL服务器/SSL客户端,则对端利用该证书中的公钥验证SSL服务器/SSL客户端的身份。
    1.2.SSL协议组成
    SSL位于应用层和传输层之间,它可以为任何基于TCP等可靠连接的应用层协议提供安全性保证。SSL协议本身分为两层:
    • 上层:SSL握手协议(SSL handshake protocol)、SSL密码变化协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol);
    • 底层:SSL记录协议(SSL record protocol)。
    1)SSL握手工作传输层
    握手协议是客户机和服务器用SSL连接通信时使用的第一个子协议,握手协议包括客户机与服务器之间的一系列消息。SSL中最复杂的协议就是握手协议。该协议允许服务器和客户机相互验证,协商加密和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。
    握手协议是在应用程序的数据传输之前使用的。它建立在SSL记录协议之上,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
    每个握手协议包含以下3个字段:
    (1)Type:表示10种消息类型之一
    (2)Length:表示消息长度字节数
    (3)Content:与消息相关的参数
    2)SSL密码变化协议
    客户端和服务器端通过密码变化协议通知对端,随后的报文都将使用新协商的加密套件和密钥进行保护和传输。
    3)SSL警告协议
    客户机和服务器发现错误时,向对方发送一个警报消息,消息中包含告警的严重级别和描述。如果是致命错误,则算法立即关闭SSL连接,双方还会先删除相关的会话号,秘密和密钥。每个警报消息共2个字节,第1个字节表示错误类型,如果是警报,则值为1,如果是致命错误,则值为2;第2个字节制定实际错误类型。
    4)SSL记录协议
    记录协议在客户机和服务器握手成功后使用,即客户机和服务器鉴别对方和确定安全信息交换使用的算法后,进入SSL记录协议。主要负责对上层的数据(SSL握手协议、SSL密码变化协议、SSL警告协议和应用层协议报文)进行分块、计算并添加MAC值、加密,并把处理后的记录块传输给对端
    记录协议向SSL连接提供两个服务:
    (1)保密性:使用握手协议定义的秘密密钥实现
    (2)完整性:握手协议定义了MAC,用于保证消息完整性
    1.3.SSL握手过程
    SSL通过握手过程在客户端和服务器之间协商会话参数,并建立会话。会话包含的主要参数有会话ID、对方的证书、加密套件(密钥交换算法、数据加密算法和MAC算法等)以及主密钥(master secret)。通过SSL会话传输的数据,都将采用该会话的主密钥和加密套件进行加密、计算MAC等处理。
    不同情况下,SSL握手过程存在差异。下面将分别描述以下三种情况下的握手过程:
    • 只验证服务器的SSL握手过程
    • 验证服务器和客户端的SSL握手过程
    • 恢复原有会话的SSL握手过程
    只需要验证SSL服务器身份,不需要验证SSL客户端身份时,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服务器的身份验证
    这里利用了公钥和对称密钥结合的方法。
     
    SSL客户端的身份验证是可选的,由SSL服务器决定是否验证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客户端身份验证成功。
    协商会话参数、建立会话的过程中,需要使用非对称密钥算法来加密密钥、验证通信对端的身份,计算量较大,占用了大量的系统资源。为了简化SSL握手过程,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客户端判断密钥和加密套件是否正确。
    HTTPS是基于SSL安全连接的HTTP协议。HTTPS通过SSL提供的数据加密、身份验证和消息完整性验证等安全机制,为Web访问提供了安全性保证,广泛应用于网上银行、电子商务等领域。
     
    2.TLS传输层安全协议
    TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
    TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1,它是写入了 RFC 的。
    TLS 1.0 IETF将SSL标准化,即RFC 2246,并将其称为TLS(Transport Layer Security)。从技术上讲,TLS 1.0与SSL 3.0的差异非常微小。但正如RFC所述"the differences between this protocol and SSL 3.0 are not dramatic, but they are significant enough to preclude interoperability between TLS 1.0 and SSL 3.0"(本协议和SSL 3.0之间的差异并不是显著,却足以排除TLS 1.0和SSL 3.0之间的互操作性)。TLS 1.0包括可以降级到SSL 3.0的实现,这削弱了连接的安全性。
    SSL3.0和TLS1.0几乎是一样的,后来沿着TLS的路径发展,不在更新SSL,目前广泛用的是TLS1.2,,最新的是TLS1.3。具体每个版本情况如下:
    1)TLS 1.1
    TLS 1.1在RFC 4346中定义,于2006年4月发表,它是TLS 1.0的更新。在此版本中的差异包括:
    • 添加对CBC攻击的保护:
    • 隐式IV被替换成一个显式的IV。
    • 更改分组密码模式中的填充错误。
    • 支持IANA登记的参数。
    2)TLS 1.2
    TLS 1.2在RFC 5246中定义,于2008年8月发表。它基于更早的TLS 1.1规范。主要区别包括:
    • 可使用密码组合选项指定伪随机函数使用SHA-256替换MD5-SHA-1组合。
    • 可使用密码组合选项指定在完成消息的哈希认证中使用SHA-256替换MD5-SHA-1算法,但完成消息中哈希值的长度仍然被截断为96位。
    • 在握手期间MD5-SHA-1组合的数字签名被替换为使用单一Hash方法,默认为SHA-1。
    • 增强服务器和客户端指定Hash和签名算法的能力。
    • 扩大经过身份验证的加密密码,主要用于GCM和CCM模式的AES加密的支持。
    • 添加TLS扩展定义和AES密码组合。所有TLS版本在2011年3月发布的RFC 6176中删除了对SSL的兼容,这样TLS会话将永远无法协商使用的SSL 2.0以避免安全问题。
    3)TLS 1.3
    TLS 1.3在RFC 8446中定义,于2018年8月发表。它基于更早的TLS 1.2规范,与TLS 1.2的主要区别包括:
    • 将密钥协商和认证算法从密码包中分离出来。
    • 移除脆弱和较少使用的命名椭圆曲线支持(参见椭圆曲线密码学)。
    • 移除MD5和SHA-224密码散列函数的支持。
    • 请求数字签名,即便使用之前的配置。
    • 集成HKDF和半短暂DH提议。
    • 替换使用PSK和票据的恢复。
    • 支持1-RTT握手并初步支持0-RTT。
    • 通过在(EC)DH密钥协议期间使用临时密钥来保证完善的前向安全性
    • 放弃许多不安全或过时特性的支持,包括数据压缩、重新协商、非AEAD密码本、静态RSA和静态DH密钥交换、自定义DHE分组、点格式协商、更改密码本规范的协议、UNIX时间的Hello消息,以及长度字段AD输入到AEAD密码本。
    • 禁止用于向后兼容性的SSL和RC4协商。
    • 集成会话散列的使用。
    • 弃用记录层版本号和冻结数以改进向后兼容性。
    • 将一些安全相关的算法细节从附录移动到标准,并将ClientKeyShare降级到附录。
    • 添加带有Poly1305消息验证码的ChaCha20流加密。
    • 添加Ed25519和Ed448数字签名算法。
    • 添加x25519和x448密钥交换协议。
    • 将支持加密服务器名称指示(EncryptedServerNameIndication, ESNI)。
     
    该协议由两层组成:
    TLS 记录协议(TLS Record)较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。
    TLS 握手协议(TLS Handshake)。
    TLS与SSL的差异
    版本号 : TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。
    报文鉴别码、伪随机函数、报警代码、密文族和客户证书、certificate_verify和finished消息、加密计算、填充
    TLS的主要增强内容
    TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS 在SSL v3.0 的基础上,提供了以下增强内容:
    • 更安全的MAC算法
    • 更严密的警报
    • “灰色区域”规范的更明确的定义
     

    特别声明:

    1.以上所有描述内容部分参考链接/文献未逐一列出,若有侵权,请及时告知,有则改之无则加勉。
    2.以上仅是学习过程的总结,相信有很多理解偏差的地方,特别希望指出,给予帮助,更新知识体系,共同进步。



  • 相关阅读:
    union 和 union all 区别
    sql 日期类型空值等于 1900-01-01
    IDENTITY_INSERT 自增开关使用
    Convert.ToDateTime() 与 DateTime.TryParse()区别
    SOLID 原则摘录
    不同JavaScript 代码段 变量作用域
    sql 常见错误总结
    jquery.form插件 提交表单 type="hidden"取不到值的问题记录
    同义词
    SQL优化传送门
  • 原文地址:https://www.cnblogs.com/worter991/p/13444411.html
Copyright © 2011-2022 走看看