https详解
What is https?
https是一种在http的基础上加了SSL/TLS层(安全套接层)的安全的超文本传输协议,其传输的内容是通过加密的。 https确切地说不是一种协议,而是http + SSL (TLS)的结合体。http报文经过SSL层加密后交付给TCP层进行传输。
https就是在http与TCP层中间添加了一个SSL层。因为https比http多了这层加密的流程,所以https的速度要比http慢的多。
http协议存在的问题
- 数据使用明文传输,可能被窃取
- 报文的完整性无法验证,可能被篡改(DNS劫持,网页中间被加广告)
- 无法验证通信双方的身份,可能被伪装
加密算法
- AES--对称加密
- 只有一个密钥,该密钥可以用来加密,也可以用来解密;加解密计算速度快。
- RSA--非对称加密
- 加密和解密的过程中,需要一个公钥、一个私钥,公钥负责加密,私钥负责解密;加解密计算速度慢。
https通信过程
SSL加密过程就是通过RSA加密方式来交换AES加解密的密钥,然后使用AES对报文加密传输。
根据图解,大体可分为8个步骤:
- 客户端向服务端发起https请求,主要目的是从服务端获取数字签名证书
- 服务端将数字证书发送给客户端
- 客户端校验证书的合法性,不合法会显示告警信息,合法则会生成一个对称加密key,这个key是用来对请求响应报文进行AES对称加密的
- 客户端使用从证书中提取到的公钥,对key进行RSA非对称加密
- 客户端发起https中的第二个http请求,将加密后的key发送给服务端
- 服务端使用私钥对收到的密文进行RSA非对称解密,得到明文的加密密钥key,响应客户端已收到
- 客户端使用该key对请求报文做AES加密,将密文发送给服务端
- 服务端收到请求密文,用key对其AES解密,得到请求内容,并用key将响应内容AES加密后返回给客户端
https如何解决伪装、篡改、窃取的问题
数字证书--防伪装
自己通过RAS算法生成了一个私钥和公钥,在公钥发送给客户端的过程中有可能被篡改成其他的公钥,而客户端在没有其他措施的保护下是不知道该公钥是否就是服务器那边的私钥对应的公钥的。这有可能在公钥分发的过程中被篡改。
为了防止公钥被篡改,需要一个第三方的权威机构来证明这个证书就是服务端发的证书,这个机构就是CA机构,由CA机构颁发的证书是合法的。
数字证书是https实现安全传输的基础,它是由权威的CA机构颁发的,有了数字证书就相当于有了一把安全秘钥 。
证书的主要内容有:公钥(Public Key)、ISSUER(证书的发布机构)、Subject(证书持有者)、证书有效期、签名算法、指纹等。
可以看到公钥是一串很长的2048 Bits的字符串,同时也可以看到<使用者>的内容包含了baidu.com域名,在后面验证URL链接是否正确的时候用到,还有颁发者、有效期、签名算法等等 。
上面展示了baidu的CA证书内容,颁发者是GlobalSign,它就是权威的CA机构了。CA机构除了给别人颁发证书以外,它也有自己的证书,这个证书是机构自己颁发给自己的,我们称它为根证书,根证书也有自己的公钥和私钥,我们称之为根公钥和根私钥,根公钥和加密算法是对外公布的,而根私钥是CA机构自己绝对保密的。这个根证书在验证证书的过程中起着核心的作用。
根证书用于验证证书的合法性。
Chrome查看根证书:设置 -> 隐私设置和安全性 -> 安全 -> 管理证书
在受信任的根证书颁发机构
中我们看到一系列的CA机构,baidu的证书颁发者GlobalSign机构也在其中,这些权威机构的根证书都是浏览器预先嵌入到其系统中的 ,一些开源框架也内置了受信任的根证书。
可以看到颁发者和使用者都是GlobalSign,里面的公钥就是根公钥,在验证其他数字证书时起着关键作用。
数字签名--防篡改
在证书内容中可以看到一个指纹字段,它是证书身份的唯一代表, 用来保证证书的完整性的,确保证书没有被修改过 。
证书在发布之前,CA机构对证书内容用指纹算法(一般是sha1或sha256)计算得到一个hash值,这个hash值就是指纹。 hash值具有不可逆性 、唯一性, 无法通过hash值计算出原来的信息内容,不同的内容一定得到不同的hash值。
数字签名是在信息后面加上的一段数字串,可以证明该信息有没有被修改过 。 数字证书在发布的时候,CA机构将证书的指纹和指纹算法通过自己的私钥加密,得到的就是证书的签名了 。
证书验证:
- 获得证书的指纹:
- 通过CA机构根证书的根公钥,解密证书的签名,得到证书的指纹和指纹算法,这个指纹是证书颁发前由CA机构计算证书内容得到的,暂时记为H1,代表证书的原始内容
- 计算当前证书的hash值:
- 用解密得到的指纹算法对当前的证书内容进行一次hash计算,得到H2,代表当前证书的内容
- 校验合法性:
- 对比H1和H2,如果相同就代表证书没有被篡改过 。 如果证书被篡改过,H2和H1是不可能相同的,因为hash值具有唯一性,不同内容通过hash计算得到的值是不可能相同的
伪造证书是没用的,因为伪造的指纹不可能用CA机构的私钥加密,自然也就无法用根公钥解密。
自签名证书是无法被CA机构根证书验证的
验证证书是服务器发的,不是中间人发的:
在证书没有被篡改的基础上,再检查证书中使用者的域名(baidu.com),和我们请求的域名是否一致,如果一致则可证明当前浏览器的链接是正确的。
但如果浏览器的链接被中间人截取了,他也可以发一个正规的证书给浏览器,也可以通过根证书验证,证明没有被篡改。但是通过对比证书上的域名和我们请求的域名是否一致,可以判断当前证书是不是服务器发的证书。 因为域名具有唯一性,所以中间人的证书的上的域名和我们的证书的域名是不可能相同的 。
CA机构在颁发证书前,需要在申请的域名上添加一条记录值,来证明该域名是申请者所有的
数字证书主要验证了3点:
- 证书是否为受信任的权威机构颁发的
- 证书是否被篡改
- 证书是否为服务器发过来的,而不是第三方发的
加密--防窃取
第4步中,生成对称加密key,通过证书中的公钥加密成密文,发送给服务端 。因为此密文是用公钥加密的,这是一个非对称加密 ,只能用服务端的密钥解密,第三方窃取到这个密文也无法解密。
发送密文的时候也会对它进行签名,就是对密文内容进行hash计算得到的hash值 ,再用证书公钥加密得到签名,连同密文一起发给服务端。
服务端用私钥对签名解密得到密文的hash值H1,再用相同的指纹算法对收到的密文进行hash计算,得到H2,相同则密文没有被篡改,进而对密文解密,得到对称加密key。
到此,客户端与服务端都有了key,就可以对请求与响应报文做AES对称加密传输了,也能够保证较快的加解密速度。
总结
- HTTPS通信过程确保了通信双方的身份,保证报文的完整性,对数据加密传输,防止数据被伪装、篡改、窃取。
- HTTPS混合使用对称加密和非对称加密,多了两次交换密钥的HTTP通信,交换密钥和加解密过程对性能造成了一定损耗