今天技术开了一次分享会,主要是分享了http和https相关的一些知识。
其中很多知识了解,但是不是特别清楚,听完了对https更清楚了一些。
https其实就是在http协议的基础上多添加了一层加密传输层。一般采用TLS(SSL会有缺陷),其实TLS和SSL说的是一个东西,就像ECMAScript和JavaScript一样,TLS是规范化的SSL协议,比SSL更安全。
TLS过程:
- 首先客户端会发起第一次请求,告知服务器支持的协议版本、支持的加密算法、和一个随机数。
- 服务器会根据客户端的请求,选择合适的协议和加密算法,然后传递给客户端第二个随机数,还有服务器的证书(其中有公钥)。
- 客户端会使用服务端的公钥进行加密传输第三个随机数,通知服务端改变编码规则(使用加密编码),结束握手通知。
- 服务端很根据三个随机数生成一个秘钥,然后告诉客户端改变编码规则(,结束握手通知。
- 客户端和服务端使用对称加密开始传输数据。
其中要注意的就是:客户端和服务端都会有这三个随机数,因为客户端告诉了服务端支持哪些加密算法,所以客户端和服务端都用相同的算法把三个随机数生成一个对称秘钥,然后开始使用对称秘钥加密进行传输。
那如何来保证安全呢?答案就在第三个随机数上。
因为客户端最后传给服务端的第三个随机数是用服务端的公钥加密过的,所以理论上只有服务端才能解密第三个随机数,进而生成的对称秘钥只有双方知道。
那如果在传输中间被劫持了,在传输第三个随机数的时候:劫持者把服务器的公钥劫持后换成自己的公钥发给客户端,客户端用劫持者的公钥加密了第三个随机数传给服务端,然后劫持者解密后,再用劫持到的真正服务器的公钥加密后传回给服务器,这样不就拿到了三个随机数,和加密规则。那后面的加密算法都无效了。
客户端<————攻击者<————服务端
伪造证书 拦截请求
所以这就是证书的用途了。为什么服务器不直接传递公钥而是传递了一个带有公钥的证书,就是为了防止上述问题的发生。证书是由CA来颁发的(一个专门颁发数字证书的机构)
数字证书的颁发过程:
用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息(根证书私钥签名)。用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构发布,数字证书各不相同,每种证书可提供不同级别的可信度。
浏览器默认都会内置CA根证书,其中根证书包含了CA的公钥
- 证书颁发的机构是伪造的:浏览器不认识,直接认为是危险证书
- 证书颁发的机构是确实存在的,于是根据CA名,找到对应内置的CA根证书、CA的公钥。用CA的公钥,对伪造的证书的摘要进行解密,发现解不了,认为是危险证书。
- 对于篡改的证书,使用CA的公钥对数字签名进行解密得到摘要A,然后再根据签名的Hash算法计算出证书的摘要B,对比A与B,若相等则正常,若不相等则是被篡改过的。
- 证书可在其过期前被吊销,通常情况是该证书的私钥已经失密。较新的浏览器如Chrome、Firefox、Opera和Internet Explorer都实现了在线证书状态协议(OCSP)以排除这种情形:浏览器将网站提供的证书的序列号通过OCSP发送给证书颁发机构,后者会告诉浏览器证书是否还是有效的。
- 1、2点是对伪造证书进行的,3是对于篡改后的证书验证,4是对于过期失效的验证。
上面部分来自详解https是如何确保安全的?,因为CA认证这部分理论很多,我自己叙述起来也不会很清楚。
不过有一点可以说明,就是CA证书认证的时候会有签名,这个签名是用服务器自己的私钥来签名的,这样CA根据服务器的公钥就能解密签名。判断这确实是这对公私钥的持有者。(因为私钥被认为只有自己持有没有被泄露)。
这样有了CA在中间的保证,没有中间劫持者来劫持掉证书,这个证书是安全的合法的。所以认为这个https链接也是安全的。
为什么charles可以抓包https?
其实charles就是上面所说的中间劫持者。他抓包的过程其实就是一个中间劫持转发的过程。因为在charles解密https之前,必须得在手机上装一个证书。这个其实就是charles的证书。因为这个证书不被CA所认可的(认为是非法的证书)所以手机默认其实是不带有这个证书的。
你在手机上装了这个证书,就是承认的他的合法性和安全性,所以中间劫持了用了charles的公钥加密了你也认为没有问题。
当然这是在我们调试的时候,其实普通用户使用时是没有安装charles的证书的,所以当charles抓包普通用户的时候(中间劫持,使用charles的证书),普通用户认为这个证书是不合法的危险的,就是提示出来(微信浏览器默认拒绝不安全的https)。所以这样看来https是很安全的传输协议。
以上。