zoukankan      html  css  js  c++  java
  • HTTP HTTPS SSL/TLS 介绍

    前言

    本文旨在记录HTTP、HTTPS、SSL/TLS的特点。

    正文

    1. HTTP
    • 解释: Hypertext Transfer Protocal, 超文本传输协议,属于TCP/IP第五层、OSI第七层协议栈。是B/S架构应用体系中应用最广的协议。
    • 用法:在要访问的URL或URI前,加http://即可。
    • 优点:规则统一,便于使用,消耗较小。
    • 缺点:明文传输,很容易被中间人拦截(窃听、篡改、冒充),不安全。
    • 默认端口:80

    于是,我们引入了HTTPS。

    1. HTTPS
    • 解释:Secure HTTP,即HTTP + 安全套件(SSL、TLS、Cert等)
    • 用法:需要在访问的URL或URI前,加https://即可。(前提是该网站已加过安全套件)
    • 优点:规则统一,便于使用,且由于对信息加密,安全性较高。
    • 缺点:消耗较大,需要管理安全套件
    • 默认端口:443
    1. SSL/TLS
    • 解释:SSL(Secure Sockets Layer), TLS(Transport Layer Security), 均为安全套件, TLS用于替代SSL。
    • 作用:
      1. 所有信息加密传播,第三方无法窃听
      2. 完整性校验机制,因此无法篡改传输内容
      3. 对身份进行验证,防止冒充
    • 优点:安全
    • 缺点:消耗大,需要维护
    • 最常用:TLS1.1 TLS1.2

    具体过程

    1. HTTP(基于TCP连接)

      1.1 建立连接的三次握手

    第一次握手:客户端发SYNbit包,指明客户端要访问的端口;并发出初始序列号X;然后客户端进入SYN_SENT状态。

    第二次握手:服务器发ACK包应答,即SYNbit和ACKbit均为1;ACK应答设置为x+1;Seq为y ;然后服务器进入SYN_RCVD状态。

    第三次握手:客户端发ACK包确认收到,故ACKbit为1,ACKnum为y+1,进入Establish状态;服务器收到这个包后,也进入Establish状态,TCP连接建立。

    ​ 1.2 断开连接的四次挥手

    第一次挥手:客户端发送离线请求,即FINbit=1;表明自己不会主动发数据了,但是可以收数据;然后客户端进入FIN_WAIT_1状态。
    第二次挥手:服务器收到此请求并回复,即ACKbit=1,ACKnum=x+1;表明自己已接收断开连接的请求,但是尚未准备好关闭连接;然后服务器进入CLOSE_WAIT状态。客户端收到此确认包之后,进入FIN_WAIT_2状态。
    第三次握手:服务器做好关闭连接的准备,并发送断开连接的请求,故ACKbit=1, seq=y;然后服务器进入LAST_ACK状态。
    第四次握手:客户端收到此请求后发送确认包,进入TIMED_WAIT状态;服务器收到断开连接的确认包后,断开连接,并进入CLOSED阶段。客户端在2个最大生命周期内未收到回复时,会断开与服务器的连接,并将状态置于CLOSED。

    1. HTTPS(基于TLS)

    由于HTTPS是基于HTTP的,只是加了一步认证的过程。所以此处只讲加密这一部分。

    对于HTTPS的加密,TLS使用的是公私钥+证书的方式。

    具体的图示如下:

    第一次握手:客户端向服务器发送ClientHello请求。
    ​ 可提供以下信息:
    ​ 1) 支持的协议版本,例如TLS1.0
    ​ 2) 一个客户端生成的随机数,稍后用于生成"对话密钥"。
    ​ 3) 支持的加密方法,比如RSA公钥加密。
    ​ 4) 支持的压缩方法。

    第二次握手:服务器回应客户端的请求。
    ​ 可提供以下信息:
    ​ 1) 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
    ​ 2) 一个服务器生成的随机数,稍后用于生成"对话密钥"。
    ​ 3) 确认使用的加密方法,比如RSA公钥加密(包含在服务器证书里)。
    ​ 4) 服务器证书。

    第三次握手:客户端回应。如果证书有问题(不是可信任机构颁发、实际域名不一致、证书过期等),就会报出一个警告来;如果证书没问题,就会提供以下信息给服务器:
    ​ 1) 一个随机数。该随机数用服务器公钥加密,防止被窃听。
    ​ 2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
    ​ 3) 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

    ​ 上面三次握手有三个随机数,可用来生成本次连接的会话密钥。

    第四次握手:服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。
    ​ 1) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
    ​ 2) 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

    至此,TLS的加密完成。之后的通讯采用HTTP方式进行,只不过明文都需要被加密。

    鸣谢

    由于此文过于理论,所以我参考了以下两位大佬的博客,再次对他们表示感谢。

    直击阿里面试

    阮一峰博客 SSL/TLS

    About me: 资深大猪蹄子
  • 相关阅读:
    保护ASP.NET 应用免受 CSRF 攻击
    在html页头设置不缓存
    ASP.NET MVC – 关于Action返回结果类型的事儿(上)
    UC浏览器 分享到朋友圈和微信好友
    利用java Base64 实现加密、解密
    Java图片工具类,完成图片的截取和任意缩放
    iscroll动态加载数据完美解决方案
    ASP.NET三层架构的分析
    如何用浏览器调试js代码
    练习使用jquery.并将验证强度的功能加到注册页面中
  • 原文地址:https://www.cnblogs.com/young233/p/15036089.html
Copyright © 2011-2022 走看看