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

Posted 楠c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP与HTTPS(详谈TLS秘钥协商过程)相关的知识,希望对你有一定的参考价值。

1. 简单http服务器

#pragma once 

#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string>
#include<cstdlib>
#include<strings.h>
#include<netinet/in.h>
#include<signal.h>
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 += "\\
         <!DOCTYPE html>\\
         <html>\\
         <head>\\
         <title>xust</title>\\
         </head>\\
         <body>\\
         <h1>welcome</h1>\\
         <p>niubi</p>\\
         </body>\\
         </html>";
         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测试一下
在这里插入图片描述

在使用手机访问浏览器访问,可以看见请求报头
服务器接收到的客户端的request
在这里插入图片描述

在实验中我们将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 对称加密

用一个秘钥进行加密,解密,成为对称加密。
在这里插入图片描述
那么又引入一个问题,秘钥也是数据,怎么保证秘钥的安全。

3.4 非对称加密

通常来说,公钥是用来加密,私钥只能用来使用来解密的。
在这里插入图片描述

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

还有一种场景,假如中间服务器是一个黑客
在这里插入图片描述
类似于fiddler

那么就引发两个问题

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

以上是关于HTTP与HTTPS(详谈TLS秘钥协商过程)的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS--握手,证书及秘钥协商

[skill][https][ssl/tls] HTTPS相关知识汇总

docker集群--portainer+TLS安全连接docker主机(详细介绍与使用心得)

TLS加密过程

HTTPS协议详解:TLS/SSL握手过程

SSL握手过程