1.概要
https是http与ssl的结合,为了解决http明文传输导致信息泄露的问题。ssl通过公钥和私钥保证客户端和服务器之间的通讯加密,由权威机构办法的数字证书杜绝了中间人攻击的可能。
2.http和ssl
http是处于应用层的传输协议,ssl是处于与TCP同层的传输层和应用层之间的协议,由于http使用明文传输,就会导致数据在传输过程中泄露,为此将http和ssl两者结合后得到https。
3.使用公钥和私钥进行数据传输
当客户端发送请求到服务端的时候,将会收到服务端发送的公钥,服务器有对应的私钥; 服务端与客户端进行通讯的时候,使用私钥将数据进行加密传输,客户端使用公钥进行解密后获得内容,而客户端发送数据到服务端的时候会使用公钥将内容进行加密,服务器接收后使用私钥解密。
image.png
但是当一开始服务端发送的公钥到客户端的过程中有可能被第三方劫持,然后第三方自己伪造一对密钥,将公钥发送给客户端,当服务器发送数据给客户端的时候,中间人将信息进行劫持,用一开始劫持的公钥进行解密后,然后使用自己的私钥将数据加密发送给客户端,而客户端收到后使用公钥解密,反过来亦是如此,整个过程中间人是透明的,但信息泄露却不得而知。
image.png
4.数字证书
为了防止中间人攻击,整个传输过程中亟需解决的是保证客户端收到的公钥是服务端发送的,为此提出了数字证书,数字证书是由权威的CA机构给服务端进行颁发,CA机构通过服务端提供的相关信息生成证书,证书内容包含了持有人的相关信息,公钥,签署者签名信息等,最重要的是公钥在数字证书中。
数字证书是如何保证公钥来自请求的服务器呢?数字证书上由持有人的相关信息,通过这点可以确定其不是一个中间人;但是证书也是可以伪造的,如何保证证书为真呢?
一个证书中含有三个部分:"证书内容(F1), 加密算法(A),加密密文(F3') ",三者的关系如下图,证书内容F1F会被散列算法SHA1计算出hash值F2,然后使用CA机构提供的私钥进行RSA加密
image.png
当客户端发起请求的时候,服务器将该数字证书发送给客户端,客户端将其中的加密密文(F3)通过CA机构提供的公钥及逆行解密后得到F2,同时将证书内容(F1)使用SHA1散列成F2,如果两者相等则说明证书没问题。
image.png
由于劫持者不知道当初加密使用的私钥是什么,所以永远无法伪造出一个正确的证书可以通过上述的验证,但仔细思考后发现,这个办法的核心是保证上图中提供RSA解密的公钥是绝对正确的,否则的话,劫持者可以改变到这个公钥的话,那伪造的证书也可以通过验证了,但我还不知道是如何保证这个公钥绝对没问题。部分的猜想是,由于这个公钥是相对固定的,部分操作系统在安装的时候这些公钥就被写进操作系统中,通过权限控制导致这个公钥很难被修改。
5.完整的https通信方式
当客户端接收了从服务端发送而来的数字证书,进行计算验证后发现证书没有问题,说明这个公钥是服务器发送的,从证书中获取服务端的公钥,就可以和服务器进行加密通信了。但是非对称加解密太耗费时间,因此客户端会发送一个对称密钥给服务端,由于这个密钥使用了公钥进行加密,只有服务端才能解开得到,往后服务端和客户端可以通过这个对称密钥进行高效的安全通讯。
6.其余
很多时候从CA机构获取的数字证书是要钱的,但简单的开发测试的时候可以自己创建数字证书,比如,此类证书使用的时候浏览器会报告不安全,是因为没有公钥无法验证,可以选择信任证书,或者是安装证书,其实是一个意思。