白话说https运行原理
https到底是什么?是怎么运作的呢?
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层。
在很久很久以前,那时候还没有https,大家还都很讲武德,自从马保国退出武林之后,武林开始动荡了起来,一切变得不安全了。
此时,http的传输安全成为了当务之急必须处理的一个问题。
那么,该怎么解决呢?
聪明如我的你一定会想到,数据加密啊。不错。这就是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
的请求。
openssl
简介- 自签名证书
- 本地私有CA证书
openssl
的简介
OpenSSL 是一个开源项目,其组成主要包括一下三个组件:
- openssl:多用途的命令行工具
- libcrypto:加密算法库
- libssl:加密模块应用库,实现了ssl及tls
openssl可以实现:秘钥证书管理、对称加密和非对称加密更多简介和官网和openssl简介。
自签名证书
为了能够把线上的https
的请求,走向本地,需要我们本地也有https
服务,那么证书就是不可避免的,然而一般情况我们并不是使用线上的证书,因为走本地需要本地启用服务,如果证书使用线上的,那么本地起服务的话就需要线上的私钥等隐私信息,这很容易导致私钥泄露,所以不安全,那么我们就需要生成一个本地的证书;
前文讲过了,一个证书是需要经过CA机构
进行认证签名的,那么我们本地测试使用的证书然道也要去申请认证吗?但是否定的,因为这个这是只是我们本地使用,所以只需要我们有证书,并且手动添加信任就行,那么自签名证书就很好的解决了这个问题。
自签名证书
:跟多详细介绍,自签名证书的核心就是自己对自己的申请进行签名【CA根证书就是这样产生的】;使用自己的私钥对自身生成的证书申请CSR进行签名得出的证书。
通过自签名证书
我们获得了https
服务需要的证书,根据本地不同的环境,都需要对该证书进行一个信任,这样我们本地起的https
服务才会被浏览器正确的识别。整个过程如下:
生成秘钥
openssl genrsa -des3 -out cwj.key 2048
使用以上命令,来生成一个我们本地需要的私钥,后面需要使用私钥来生成证书申请CSR以及对证书申请CSR使用私钥进行自签名
生成证书申请CSR
openssl req -new -key cwj.key -out cwj.csr
需要填写一系列信息,包括地点、单位、域名、email之类的,这里会自动使生产与服务端私钥匹配的公钥,CSR中包含了公钥;
使用私钥完成自签名,生成完整的证书
openssl x509 -req -sha256 -days 3650 -in cwj.csr -signkey cwj.key -out cwj.crt
使用前生产的秘钥对证书申请CSR进行信任签名,得到完整的证书;
这样的确满足了部分需求,只需要使用该证书和私钥来启动https
服务,同时本地信任这个证书就大功告成了,其中优点如下:
- 本地自签名,无须CA根证书;
- 过程简单
不过也存在一些弊端:
- 该证书无法被吊销,私钥需要保存好,不过对于仅用于本地调试来说就无伤大雅;
- 多域名需要多个证书,需要根据域名生成多个证书,客服端需要分别信任这些证书。【不过
openssl
也可以生成多域名证书,一个证书可以供多个域名使用,一般使用openssl.cnf
配置文件来生成】
所以还存在其他的方法:为了模拟完整的真是的https
服务,我们可以在本地生成一个类似CA根证书,通过CA的私钥来对其他的所有的本地证书进行签名,只有信任了本地的CA根证书,那么他签名的证书都会被信任,这样就是下面文提到的进化方法本地私有CA根证书
。
本地私有CA根证书伪CA根证书
这个方法的整体流程就是本地生成一个CA证书,就类似CA机构的存在,【暂且称为伪CA根证书
】通过伪CA根证书
的私钥来对其他的所有的本地证书进行签名,我们本地信任了这个伪CA根证书
,那么通过伪CA根证书
签名的证书都会被信任。避免了多个域名需要生成多个自签名证书
以及要进行分别信任的复杂行为。
伪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根证书就是一个自签名证书的例子;
本地单一域名证书秘钥、申请CSR
openssl genrsa -des3 -out cwj.key 2048 openssl req -new -key cwj.key -out cwj.csr
生成一个证书请求;
伪CA根证书
的私钥签名其他的申请CSRopenssl 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
服务的方式很多,这里就说一说nginx
;nginx官网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 协议》,转载必须注明作者和本文链接