HTTPS解决了HTTP的哪些问题
- 解决内容可能被窃听的问题–加密
- 解决报文可能遭篡改问题–数字签名
- 解决通信方身份可能被伪装的问题–数字证书
加密
加密可以完美的解决被窃听的风险,比如二战时发出的电报都是加密之后发送的。加密分为两种,一种为对称加密一种为非对称加密。
对称加密
- 对称加密采用了对称密码编码技术,加密和解密使用相同的秘钥。
- 算法公开、计算量小、加密速度快、加密效率高。但是,秘钥的管理和分发非常困难,不够安全。在数据传送前,发送方和接收方必须商定好秘钥,然后双方都必须要保存好秘钥,如果一方的秘钥被泄露,那么加密信息也就不安全了。
- 常见的采用对称加密的算法有:AES,RC5,RC6。
非对称加密
- 非对称加密,加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密(公钥不能解密公钥加密的信息)。私钥加密的信息,只有公钥才能解密。
- 安全性更高,公钥是公开的,秘钥是自己保存的,不需要将私钥给别人。 但是,加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
- 常见的非对称加密算法有:RSA,DSA,ECC。
HTTPS如何选择加密方式
- 如果使用非对称性加密,在高并发下性能是一个大问题,如果使用对称加密,那如何管理密钥呢?
- To be, or not to be, that is the question。请看下面HTTPS请求流程
数字签名
发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用发送方的秘钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再秘钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该报文是发送方的。
- 确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名
- 数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将发生变化。
- 公钥不能在不安全的网络中直接发送。此时就需要引入了证书颁发机构(Certificate Authority,简称CA)
数字证书
- 服务端人员使用RSA算法生成两个密钥,一个用来加密一个用来解密。将负责加密的那个密钥公布出去,所以我们称之为公钥(Public Key),而用来解密的那个密钥,不能对外公布,只有服务端持有,所以我们称之为私钥(Private Key)。服务端在将Public Key进行分发证书之前需要向CA机构申请给将要分发的公钥进行数字签名。(服务器公钥负责加密,服务器私钥负责解密)
- 生成数字签名公钥证书:对于CA机构来说,其也有两个密钥,我们暂且称之为CA私钥和CA公钥。CA机构将服务端的Public Key作为输入参数将其转换为一个特有的Hash值。然后使用CA私钥将这个Hash值进行加密处理,并与服务端的Public Key绑定在一起,生成数字签名证书。其实数字签名证书的本质就是服务端的公钥+CA私钥加密的Hash值。(CA私钥负责签名,CA公钥负责验证)
- 服务器获取到这个已经含有数字签名并带有公钥的证书,将该证书发送给客户端。当客户端收到该公钥数字证书后,会验证其有效性。大部分客户端都会预装CA机构的公钥,也就是CA公钥。客户端使用CA公钥对数字证书上的签名进行验证,这个验证的过程就是使用CA公钥对CA私钥加密的内容进行解密,将解密后的内容与服务端的Public Key所生成的Hash值进行匹配,如果匹配成功,则说明该证书就是相应的服务端发过来的。否则就是非法证书。
HTTPS工作流程
- Client发起一个HTTPS请求,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
- Server把事先配置好的公钥证书(public key certificate)返回给客户端。
- Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
- Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。
- Server使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。
- Server使用对称密钥加密“明文内容A”,发送给Client。
- Client使用对称密钥解密响应的密文,得到“明文内容A”。
- Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”。