白话说https运行原理

https到底是什么?是怎么运作的呢?

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层。

白话说https运行原理

在很久很久以前,那时候还没有https,大家还都很讲武德,自从马保国退出武林之后,武林开始动荡了起来,一切变得不安全了。
此时,http的传输安全成为了当务之急必须处理的一个问题。

那么,该怎么解决呢?

聪明如我的你一定会想到,数据加密啊。不错。这就是https演化的第一步。

白话说https运行原理

此种方式属于对称加密,双方拥有相同的密钥,信息得到安全传输,但此种方式的缺点是:
(1)不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高
(2)因每个客户端、服务器的安全级别不同,密钥极易泄露

第二步:既然使用对称加密时,密钥维护这么繁琐,那我们就用非对称加密试试。

如上图所示,客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然,但上述过程也存在缺点:

(1)公钥是公开的(也就是黑客也会有公钥),所以第 ④ 步私钥加密的信息,如果被黑客截获,其可以使用公钥进行解密,获取其中的内容。

第三步:非对称加密既然也有缺陷,那我们就将对称加密,非对称加密两者结合起来,取其精华、去其糟粕,发挥两者的各自的优势。

如上图所示

(1)第 ③ 步时,客户端说:(咱们后续回话采用对称加密吧,这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器。

(2)服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密。

(3)后续两者之间信息的传输就可以使用对称加密的方式了。

遇到的问题:

(1)客户端如何获得公钥

(2)如何确认服务器是真实的而不是黑客

第四步:获取公钥与确认服务器身份

1、获取公钥

(1)提供一个下载公钥的地址,回话前让客户端去下载。(缺点:下载地址有可能是假的;客户端每次在回话前都先去下载公钥也很麻烦)

(2)回话开始时,服务器把公钥发给客户端(缺点:黑客冒充服务器,发送给客户端假的公钥)

2、那有木有一种方式既可以安全的获取公钥,又能防止黑客冒充呢? 那就需要用到终极武器了:SSL证书。

如上图所示,在第 ② 步时服务器发送了一个SSL证书给客户端,SSL 证书中包含的具体内容有:

(1)证书的发布机构CA
(2)证书的有效期
(3)公钥
(4)证书所有者
(5)签名
………

3、客户端在接受到服务端发来的SSL证书时,会对证书的真伪进行校验,以浏览器为例说明如下:

(1)首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验

(2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发

(3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。

(4)如果找到,那么浏览器就会从操作系统中取出颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密

(5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比

(6)对比结果一致,则证明服务器发来的证书合法,没有被冒充

(7)此时浏览器就可以读取证书中的公钥,用于后续加密了

4、所以通过发送SSL证书的形式,既解决了公钥获取问题,又解决了黑客冒充问题,一箭双雕,HTTPS加密过程也就此形成。

所以相比HTTP,HTTPS 传输更加安全

(1) 所有信息都是加密传播,黑客无法窃听。

(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。

(3) 配备身份证书,防止身份被冒充。

也推荐看看下面这两篇文章:
www.sohu.com/a/320031789_371153
www.kuacg.com/22672.html

问题1: SSL/TLS又是啥?

SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。

TLS(Transport Layer Security,传输层安全):其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到。TLS 1.3 改动会比较大,目前正在推进中,目前使用最广泛的是TLS 1.1、TLS 1.2。

问题2:加密算法有哪些?

1、对称加密

有流式、分组两种,加密和解密都是使用的同一个密钥。
例如:DES、AES-GCM、ChaCha20-Poly1305等

2、非对称加密

加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。
例如:RSA、DSA、ECDSA、 DH、ECDHE

3、哈希算法

将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。
例如:MD5、SHA-1、SHA-2、SHA-256 等

4、数字签名

签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。

问题3:中间人能否通过第三方公钥拿到服务器公钥,进而破解对称秘钥?

我感觉好像能,但无法篡改。因为中间人也你能拿到证书机构的公钥,然后解密出服务器公钥,最后通过服务器公钥解密随机生成的对称秘钥,然后不是查看到加密数据了吗?貌似一些抓包工具信任他们的证书后就可以解密出加密数据。但如果这样的了,就防止不了窃听了。我哪里理解错了吗?请高手指教一下!

问题4:中间人能否篡改服务器证书?

不能,因为证书是通过证书机构私钥加密的,要篡改证书必须要拿到证书机构的私钥,这是不可能的。

扩展:

openssl生成证书

在大部分开发调试过程中,我们需要本地调试https的页面时候,我们需要在本地拥有证书,而openssl就是就是这样一个集成工具;通过使用openssl来完成本地调试https的请求。

  1. openssl简介
  2. 自签名证书
  3. 本地私有CA证书

openssl的简介

OpenSSL 是一个开源项目,其组成主要包括一下三个组件:

  1. openssl:多用途的命令行工具
  2. libcrypto:加密算法库
  3. libssl:加密模块应用库,实现了ssl及tls

openssl可以实现:秘钥证书管理、对称加密和非对称加密更多简介官网openssl简介

自签名证书

为了能够把线上的https的请求,走向本地,需要我们本地也有https服务,那么证书就是不可避免的,然而一般情况我们并不是使用线上的证书,因为走本地需要本地启用服务,如果证书使用线上的,那么本地起服务的话就需要线上的私钥等隐私信息,这很容易导致私钥泄露,所以不安全,那么我们就需要生成一个本地的证书;

前文讲过了,一个证书是需要经过CA机构进行认证签名的,那么我们本地测试使用的证书然道也要去申请认证吗?但是否定的,因为这个这是只是我们本地使用,所以只需要我们有证书,并且手动添加信任就行,那么自签名证书就很好的解决了这个问题。

自签名证书跟多详细介绍,自签名证书的核心就是自己对自己的申请进行签名【CA根证书就是这样产生的】;使用自己的私钥对自身生成的证书申请CSR进行签名得出的证书。

通过自签名证书我们获得了https服务需要的证书,根据本地不同的环境,都需要对该证书进行一个信任,这样我们本地起的https服务才会被浏览器正确的识别。整个过程如下:

  1. 生成秘钥

    openssl genrsa -des3 -out cwj.key 2048

    使用以上命令,来生成一个我们本地需要的私钥,后面需要使用私钥来生成证书申请CSR以及对证书申请CSR使用私钥进行自签名

  2. 生成证书申请CSR

    openssl req -new -key cwj.key -out cwj.csr

    需要填写一系列信息,包括地点、单位、域名、email之类的,这里会自动使生产与服务端私钥匹配的公钥,CSR中包含了公钥;

  3. 使用私钥完成自签名,生成完整的证书

    openssl x509 -req -sha256 -days 3650 -in cwj.csr -signkey cwj.key -out cwj.crt

    使用前生产的秘钥对证书申请CSR进行信任签名,得到完整的证书;

这样的确满足了部分需求,只需要使用该证书和私钥来启动https服务,同时本地信任这个证书就大功告成了,其中优点如下:

  1. 本地自签名,无须CA根证书;
  2. 过程简单

不过也存在一些弊端:

  1. 该证书无法被吊销,私钥需要保存好,不过对于仅用于本地调试来说就无伤大雅;
  2. 多域名需要多个证书,需要根据域名生成多个证书,客服端需要分别信任这些证书。【不过openssl也可以生成多域名证书,一个证书可以供多个域名使用,一般使用openssl.cnf配置文件来生成】

所以还存在其他的方法:为了模拟完整的真是的https服务,我们可以在本地生成一个类似CA根证书,通过CA的私钥来对其他的所有的本地证书进行签名,只有信任了本地的CA根证书,那么他签名的证书都会被信任,这样就是下面文提到的进化方法本地私有CA根证书

本地私有CA根证书伪CA根证书

这个方法的整体流程就是本地生成一个CA证书,就类似CA机构的存在,【暂且称为伪CA根证书】通过伪CA根证书的私钥来对其他的所有的本地证书进行签名,我们本地信任了这个伪CA根证书,那么通过伪CA根证书签名的证书都会被信任。避免了多个域名需要生成多个自签名证书以及要进行分别信任的复杂行为。

  1. 伪CA根证书生成并添加信任

    openssl genrsa -des3 -out ca.key 2048
    openssl req -new -key ca.key -out ca.csr
    openssl x509 -req -sha256 -days 3650 -in ca.csr -signkey ca.key -out ca.crt

    可以看到,其实ca根证书就是一个自签名证书的例子;

  2. 本地单一域名证书秘钥、申请CSR

    openssl genrsa -des3 -out cwj.key 2048
    openssl req -new -key cwj.key -out cwj.csr

    生成一个证书请求;

  3. 伪CA根证书的私钥签名其他的申请CSR

    openssl x509 -req -sha256 -days 3650 -in cwj.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out cwj.crt

更多内容openssl;这样证书的问题就解决了,视情况来看使用者是采用哪种方案来生成证书。

信任证书需要一些操作,不同系统有不同的过程,MAC是在钥匙串中信任,windows是需要导入证书;

nginx部署https实践

本地启动https服务的方式很多,这里就说一说nginxnginx官网https模块,主要用到的就是私钥和证书;根据之前提到的使用不同方法生成的证书以及服务器私钥【本地CA根证书也需要本地进行信任】。

server {
        listen       443 ssl;
        server_name  cwj.cc;

        ssl_certificate      /cwjhttps/cwj.crt;
        ssl_certificate_key  /cwjhttps/cwj.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /cwjhttps;
            index  home.html index.htm test.html;
        }
    }

以上内容整理自网络,如有侵权请告知删除。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!