HTTP与HTTPS(详谈TLS秘钥协商过程)

目录

  • 1. 简单http服务器
  • 2. 状态码
    • 2.1 网页重定向
  • 3. http与https
    • 3.1 http缺陷
    • 3.2 https与http的区别
    • 3.3 对称加密
    • 3.4 非对称加密

1. 简单http服务器

#pragma once 

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class HttpServer
{
     

  private:
    int _port;
    int _lsock;
  public:
    HttpServer(int p)
      :_port(p)
      ,_lsock(-1)
  {
     }
    void InitServer()
    {
     
      signal(SIGCHLD,SIG_IGN);
      _lsock=socket(AF_INET,SOCK_STREAM,0);
      if(_lsock < 0)
      {
     
        cout<<"socket error"<<endl;
        exit(2);
      }

      struct sockaddr_in local;
      //清零
      bzero(&local,sizeof(local));
      local.sin_family= AF_INET;
      local.sin_port=htons(_port);
      local.sin_addr.s_addr=INADDR_ANY;
      if(bind(_lsock,(struct sockaddr*)&local,sizeof(local)) < 0)
      {
     
        cout<<"bind error"<<endl;
        exit(3);
      }
      if(listen(_lsock,5) < 0)
      {
     
        cout<<"listen error"<<endl;
        exit(4);
      }  
    }
    void echoHttp(int sock)
    {
     
     char request[2048];
     size_t s=recv(sock,request,sizeof(request),0);
     if(s > 0)
     {
     
       request[s]=0;
       cout<<request<<endl;


       string response="HTTP/1.0 303 Jump\r\n";//响应行
       response += "Content-type: test/html\r\n";//报头
       //response += "location: https//www.baidu.com";
       response += "\r\n";//空行
       response += "\
         \
         \
         \
         xust\
         \
         \
         

welcome

\

niubi

\ \ "
; send(sock,response.c_str(),response.size()-1,0); } close(sock); } void start() { struct sockaddr_in peer; bzero(&peer,sizeof(peer)); for(;;) { socklen_t len=sizeof(peer); int sock=accept(_lsock,(struct sockaddr*)&peer,&len); if(sock < 0) { cerr<<"accept error"<<endl; continue; } cout<<"get a new connect"<<endl; if(fork()==0) { close(_lsock); echoHttp(sock); exit(0); } } } ~HttpServer() { if(_lsock!=-1) { close(_lsock); } } };

先使用telnet测试一下
HTTP与HTTPS(详谈TLS秘钥协商过程)_第1张图片

在使用手机访问浏览器访问,可以看见请求报头
服务器接收到的客户端的request
HTTP与HTTPS(详谈TLS秘钥协商过程)_第2张图片

在实验中我们将http的代码,直接写在了string的缓冲区里,而实际上网页是放在web根目录中,通过读文件来获取。

2. 状态码

状态码是给页面的参考值,比如404,代表着not found,只是给浏览器一个参考,这时候由程序员实现一个404错误页面。

2.1 网页重定向

网页重定向分为临时重定向和永久重定向。

301代表永久重定向:
被请求的资源已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置
302代表临时重定向
服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

对应的请求报头为location
在这里插入图片描述
用fiddler工具抓包。
这里可以故意将状态码描述写错,可以看出状态码只是一种参考。
在这里插入图片描述
location重新跳转到了百度。

3. http与https

3.1 http缺陷

http虽然很快,但是HTTP传输的内容是没有经过加密的,因此用户层的一些隐式数据很容易就被暴露,主要有以下几种不足:
1.通信使用明文(不加密),可能被窃取
2.不验证通信方的身份,因此可能遭遇伪装
3.无法验证报文的完整性,所以有可能遭到篡改

3.2 https与http的区别

http:80
https:443

这两个东西其实是一套安全协议,SSL是非标准的。https诞生时,被并入到https协议中,重新命名为TLS。
可以理解为,在http时,向下交付数据是直接交付,抓包可以抓取到数据,而https中,向下交付数据时,先交给TLS加密,然后在向下交付。
也就是在htpps协议,TLS在应用层和传输层中间。

3.3 对称加密

用一个秘钥进行加密,解密,成为对称加密。
HTTP与HTTPS(详谈TLS秘钥协商过程)_第3张图片
那么又引入一个问题,秘钥也是数据,怎么保证秘钥的安全。

3.4 非对称加密

通常来说,公钥是用来加密,私钥只能用来使用来解密的。
HTTP与HTTPS(详谈TLS秘钥协商过程)_第4张图片

那么为什么不一开始就用,服务器给的公钥进行加密,让其用服务器内部非对称私钥解密呢?
原因是,非对称加密算法比较复杂,效率比较低,对称加密简单,效率快。

还有一种场景,假如中间服务器是一个黑客
HTTP与HTTPS(详谈TLS秘钥协商过程)_第5张图片
类似于fiddler

那么就引发两个问题

  1. 中间信息被篡改的问题?
  2. 远端服务器身份认证问题?

HTTP与HTTPS(详谈TLS秘钥协商过程)_第6张图片

HTTP与HTTPS(详谈TLS秘钥协商过程)_第7张图片

HTTP与HTTPS(详谈TLS秘钥协商过程)_第8张图片

你可能感兴趣的:(计算机网络,https,http)