zoukankan      html  css  js  c++  java
  • HTTPS详解

    前言

    1990年互联网诞生之初,就已经开始用超文本传输协议HTTP传输数据,这也是为什么现在网页地址都是以http开头的原因。但是HTTP协议传输数据是明文传输,任意的人抓包就能看到传输的数据,这显然不安全。1994年,Netscape公司用加密协议增加了HTTP,开始在HTTP的基础上加入SSL(Secure Socket Layer)。称为"HTTP over SSL"或者"HTTP Secure",也就是我们现在熟知的HTTPS。

    SSL/TLS

    SSL/TLS是位于TCP/IP 7层协议中的会话层,用于认证用户和服务器,加解密数据以及维护数据的完整性,确保数据在传输过程中不会被修改。

    TLS(Transport Layer Security,传输层安全协议)是IETF制定的一种新的协议,TLS1.0是建立在SSL3.0协议规范之上,是SSL3.0协议的后续版本,可以理解为SSL3.1。TLS的主要目的是使SSL更加安全,更加完善。TLS记录格式于SSL记录格式相同,但是版本号值不一样,TLS的版本1.0使用的版本号是SSLv3.1。

    SSL/TLS分为对称加密和非对称加密两种方式。

    对称加密 

    对称加密是指加密和解密都用同一份密钥。如下图所示:

    常用的对称加密算法有AES-128,AES-192,AES-256。

    非对称加密

    非对称加密对应于一对密钥,称为私钥和公钥,用私钥加密后需要用公钥解密,用公钥加密后需要用私钥解密。如下图所示:

    对称加密的优点是运算速度快,缺点是互联网环境下无法将密钥安全的传送给对方。非对称加密的优点是可以安全的将公钥传递给对方,但是运算速度慢。

    那么HTTPS究竟是采用对称加密还是非对称加密呢?答案是两者都有。先采用非对称加密传输协商对称加密的密钥,然后用对称加密通信。

    HTTPS加密过程

    上图是比较粗粒度的讲解了HTTPS的非对称和对称加解密过程:

    1. 客户端浏览器发起连接。
    2. WEB服务器将公钥发给客户端。
    3. 客户端生成一个session key,并且将session key用公钥加密后发送给服务器。
    4. 服务器用私钥将session key解密出来。
    5. 客户端和服务器用session key做对称加密通信。

    整个流程可以这样抽象,但是实际上session key的生成是需要多次协商的结果(文章后面会讲到),我们暂且这样简单的理解。整个流程会有一个问题,第2步中WEB服务器发给客户端的公钥,万一被中间人修改了呢,换句话说,客户端怎么验证公钥的正确性呢?那就需要讲到数字签名。

    数字签名

    如上图所示,公钥内容的后面是会跟上一个数字签名,该数字签名是将公钥内容的HASH用私钥加密后的密文。客户端拿到公钥后,会用相同的HASH算法重新算一遍,得到一个HASH值hash1。然后用公钥解密数字签名得到HASH值hash2,如果hash1等于hash2就证明这个公钥是没有被中间人修改的。即使中间人修改了公钥的内容,他也没有私钥可以重新生成数字签名,用户拿到修改后的公钥一算发现HASH不对就会报错。

    TLS握手过程

    Client Hello. 客户端通过发送Client Hello消息给服务器初始化Session连接。

    Client Hello 消息包含以下字段:

    • SSL/TLS 版本号。version 2 表示的是SSL 2.0,version 3 表示的是SSL 3.0,version 3.1表示的是TLS 1.0。
    • 随机数Random_C。一共32个字节。前面4个字节是当前时间戳,后面28个字节是一个随机数。后面协商对称加密的Session Key会用到。
    • Session ID。如果是之前已经存在的连接重连,那么Session ID会是一串数字,否则是None。
    • Cipher Suite。支持的加密组件列表。例如TLS_RSA_WITH_DES_CBC_SHA, TLS 是TLS协议版本,TLS表示TLS1.0,RSA是密钥交换算法,DES_CBC是加密算法,SHA是摘要算法。
    • 压缩算法。表示建议选用的是哪种压缩算法。

    Client Hello 消息示例:

    ClientVersion 3,1
    ClientRandom[32]
    SessionID: None (new session)
    Suggested Cipher Suites:
       TLS_RSA_WITH_3DES_EDE_CBC_SHA
       TLS_RSA_WITH_DES_CBC_SHA
    Suggested Compression Algorithm: NONE

    Server Hello. 服务器收到客户端的Client Hello 消息会响应一个Server Hello 消息,包括以下字段:

    • SSL/TLS 版本,客户端和服务器都支持的SSL/TLS最高版本。
    • 随机数Random_S,一共32个字节,前面4个字节是当前时间戳,后面28个字节是一个随机数。后面协商对称加密的Session Key会用到。
    • Session ID,这里会有三种情况。1.产生一个新的Session ID,表示没有找到之前的Session ID或者之前没有这个Session ID。2. 返回客户端带上的之前的Session ID。(断链重连)3.Null,服务器没有办法产生新的Session ID。
    • Cipher Suite,服务器从刚才Client Hello消息的Cipher Suite加密列表中选中的加密组件。
    • 压缩算法,表示选中的是哪种压缩算法。

    Server Hello 消息示例:

    Version 3,1
    ServerRandom[32]
    SessionID: bd608869f0c629767ea7e3ebf7a63bdcffb0ef58b1b941e6b0c044acb6820a77
    Use Cipher Suite:
    TLS_RSA_WITH_3DES_EDE_CBC_SHA
    Compression Algorithm: NONE

    服务器发完Sever Hello 后还会发送下面几条消息:

    Server Certificate.服务器发给客户端的证书,包含公钥。客户端后面会用该密钥加密premaster secret。客户端也会校验证书的合法性,比如证书包含的域名是否就是客户端正在访问的域名。

    Server Key Exchange.[可选]当服务器的证书不包含公钥时,客户端会用它来加密后面的Client Key Exchange消息。

    Client Certificate Request.[可选]用于服务器需要验证客户端身份的情况,例如银行系统通常用U盾来证明客户端的身份。

    Server Hello Done.表示Server已经发送消息完毕并且在登陆客户端回复。

    客户端紧接着响应给服务器的消息:

    Client Certificate.[可选]客户端证书,包括客户端的公钥。响应上面的Client Certificate Request。

    Client Key Exchange.该消息包括premaster secret,TLS的版本号,再次带上版本号是因为之前的版本号是明文传输的,攻击者可能会恶意修改为较低的版本号,从而降低连接的安全系数方便发起攻击。该消息字段会用公钥加密。现在一共有Random_C,Random_S, premaster secret三个随机数,客户端和服务器端会用相同的算法,用这三个随机数作为参数,从而计算得到另外的一个随机数,即后面对称加密的密钥Session Key。

    Certificate Verify.[可选]该消息只针对有Client Certificate的情况。会计算出该消息字段的HASH,然后用客户端的私钥加密该HASH作为签名。服务器端会使用Client Certificate消息中得到的客户端公钥解密并验证这条消息的合法性。

    Change Cipher Suite.该消息通知服务器接下来的Client Finish消息将会用刚才协商的密钥Session Key来加密。

    Client Finished.该消息会列举客户端上面用到的所有加密字段,并且算出他们的HASH值,然后用Session Key加密。

    服务器在握手阶段最后回应给客户端的消息:

    Change Cipher Suite Message.该消息通知客户端接下来的消息会用Session Key来加密。

    Sever Finished Message. 对整个协商阶段用到的字段算一个HASH,然后用Session Key加密。

     

    总结

    文章首先介绍了HTTPS的由来,然后介绍了对称加密和非对称加密,以及HTTPS的加解密过程,最后详细的讲解了TLS的握手过程。

     

    参考

    https://tiptopsecurity.com/how-does-https-work-rsa-encryption-explained/

    http://www.youdzone.com/signature.html

    https://zh.wikipedia.org/wiki/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB

    https://www.tutorialsteacher.com/https/how-ssl-works

    https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc785811(v=ws.10)

    http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html

    https://www.linuxidc.com/Linux/2016-05/131147.htm

    https://hpbn.co/transport-layer-security-tls/

  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/makelu/p/11140824.html
Copyright © 2011-2022 走看看