https SSL/TLS 详解

1.TLS/SSL的前世今生

SSL(Secure Sockets Layer)最初由Netscape定义, 分别有SSLv2和SSLv3两个版本(SSLv1未曾对外发布); 在SSLv3之后SSL重命名为TLS。

TLS(Transport Layer Security)版本从TLSv1.0开始, TLSv1.0是在SSLv3的基础上升级而来。
https SSL/TLS 详解_第1张图片
多年以来已弃用的SSL协议也暴露出了一些高危漏洞(例如: POODLE, DROWN); 因此建议服务器禁用SSL3.0及SSL2.0, 只启用TLS协议。

2. 浏览器与客户端如何协商对称加密密钥
https SSL/TLS 详解_第2张图片
① 证书验证阶段
1.浏览器发起 HTTPS 请求(包含的内容如上图)
2.服务端返回CA证书(包含公钥)(包含的内容如上图)
3.客户端验证证书是否合法,如果不合法则提示告警

② 数据传输阶段
1.当证书验证合法后,在本地生成随机数
2.通过公钥加密随机数,并把加密后的随机数传输到服务端
3.服务端通过私钥对随机数进行解密
4.服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输(注意:客户端和服务端根据三个随机数+协商的算法,各自算出相同的密钥,后续数据传输,都用此密钥进行对称加密/解密)

3. 数字签名意义?
只能验证数据的完整性,依次来判断数据是否被篡改。为什么能否判断数据的完整性。因为服务器会把发送的数据A,先hash,然后在通过私钥加密最终形成数字签名,然后把数据A和数字签名发送给客户端,客户端拿到数据A和数字签名后,做两件事情,1. 把数据A 通过hash 得到摘要1 , 2. 使用公钥对数字签名解密得到摘要2, 然后对比摘要1和摘要2是否相等。依次来判断数据的完整性。
这里面可能大家有疑问。为什么要用hash得到摘要。 因为传输的数据长度是不固定。有几个字节,几K,几M…
大家可以 随便对一个文件 进行MD5 or SHA256,得到的长度都是固定的,从效率上来说。加密摘要比加密数据效率要高…
最显然的是性能问题,证书信息一般较长,比较耗时。而hash后得到的是固定长度的信息(比如用md5算法hash后可以得到固定的128位的值),这样加解密就快很多。
在这里插入图片描述
https SSL/TLS 详解_第3张图片
4. 有了数字签名为什么还不够安全?
因为数字签名只能保证数据的完整性。没有被篡改,但是客户端没法保证拿到的公钥一定是服务端传给自己的。中间可能被人偷梁换柱了. 客户端和服务端都毫不知情。
如果服务端把数据A+数字签名 发给客户端, 中间被B给劫持了, 由于B没有服务器私钥,没法对数字签名解密,所以即使有公钥,也没法对原数据进行篡改。即使篡改了,转发给客户端。也很容易检测到数据被篡改了。 那B咋弄呢。他想了一个办法,把数据A+数字签名替换成自己的。转发给客户端,对客户端来说。他认为没问题,校验都能过,然后又给服务器回数据。又被b劫持了。B此时就用原服务器公钥加密一份数据。发给服务器。对服务器来说。也认为数据没问题。等于说。服务器跟客户端交互都全程被B监控了。B相当于一个中转站。能够随意篡改数据。所以。只有数字签名远远不够。所以数字证书就来了。它是所有安全的保障
https SSL/TLS 详解_第4张图片
6. 数字证书
要理解数字证书,同样只要搞懂两个问题即可。

数字证书是什么东西?其实它就是一个 .crt 文件
数字证书是谁颁发的?由权威证书认证机构颁发,一般我们简称为 CA 机构
数字证书如何申请的?或者说如何颁发的?
为了让你理解这一过程,我画了下面这张图:
https SSL/TLS 详解_第5张图片

5. 为什么数字证书是安全的?
网站在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书持有者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明“该公钥对应该网站”。而这里又有一个显而易见的问题,“证书本身的传输过程中,如何防止被篡改”?即如何证明证书本身的真实性?身份证运用了一些防伪技术,而数字证书怎么防伪呢?解决这个问题我们就接近胜利了!
https SSL/TLS 详解_第6张图片
当客户端发起请求时,服务器将该数字证书发送给客户端,客户端通过CA机构提供的公钥(一般内置在本地浏览器中)对加密密文进行解密获得散列值(数字签名),同时将证书内容使用相同的散列算法进行Hash得到另一个散列值,比对两个散列值,如果两者相等则说明证书没问题。
https SSL/TLS 详解_第7张图片

中间人有可能篡改该证书吗?
假设中间人篡改了证书的原文,由于他没有CA机构的私钥,所以无法得到此时加密后签名,无法相应地篡改签名。浏览器收到该证书后会发现原文和签名解密后的值不一致,则说明证书已被篡改,证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人。

既然不可能篡改,那整个证书被掉包呢?

中间人把证书掉包怎么办?
1.假设中间人把证书掉包,但是他没有证书私钥,所以没法解密数字证书的签名。伪造内容之后,客户端收取数据后。用公钥解密数字证书得到摘要跟数据明文hash之后得到的摘要不匹配,很容易就知道内容被篡改了。
2. 因为中间人没有证书的私钥。索性一不做二不休,把整个证书替换掉,用自己的另外合法合规的证书(自己有公钥和私钥),然后打包发一份新的证书给客户端是否可行???

给大家举个例子:
假设有另一个网站B也拿到了CA机构认证的证书,它想劫持网站A的信息。于是它成为中间人拦截到了A传给浏览器的证书,然后替换成自己的证书,传给浏览器,之后浏览器就会错误地拿到B的证书里的公钥了,这确实会导致上文“中间人攻击”那里提到的漏洞?

其实这并不会发生,因为证书里包含了网站A的信息,包括域名,浏览器把证书里的域名与自己请求的域名比对一下就知道有没有被掉包了。

https SSL/TLS 详解_第8张图片

你可能感兴趣的:(linux学习,https,ssl/tls详解)