和HTTPS握个手

作者: 大公爵 | 来源:发表于2018-05-22 16:11 被阅读212次

    “姑娘们,起来吃毓婷啦!”
    520刚过去,5月21号早上这句话就突然火了,像我这种单纯的小宝宝根本不知道是什么意思。


    正经一点

    好吧,今天要讲的是HTTPS,很多人对HTTPS的概念一直是模模糊糊的,知道一些概念,但是真要详细说又说不出多少东西来。(PS:这里的很多人指的就是我自己)所以这篇文章就来解析下HTTPS到底是个什么东东。

    HTTPS

    HTTPS并不是和HTTP对立的一种新的传输协议,而是升级版的HTTP,这里的升级就体现在S。
    HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。

    SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议。SSL协议在1994年被Netscape发明,后来各个浏览器均支持SSL,其最新的版本是3.0

    TLS的全称是Transport Layer Security,即安全传输层协议,最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。虽然TLS与SSL3.0在加密算法上不同,但是在我们理解HTTPS的过程中,我们可以把SSL和TLS看做是同一个协议。

    HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。数据是被对称加密传输的,对称加密过程需要客户端的一个密钥,为了确保能把该密钥安全传输到服务器端,采用非对称加密对该密钥进行加密传输,总的来说,对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。

    密码学

    说到这就不得不先讲一下密码学的基础概念

    1、密码

    密码学中的“密码”术语与网站登录时用的密码(password)是不一样的概念,password 翻译过来其实是“口令”,它是用于认证用途的一组文本字符串。
    而密码学中的密码(cipher)是一套算法(algorithm),这套算法用于对消息进行加密和解密,从明文到密文的过程称之为加密,密文反过来生成明文称之为解密,加密算法与解密算法合在一起称为密码算法。

    2、密钥

    密钥(key)是在使用密码算法过程中输入的一段参数。同一个明文在相同的密码算法和不同的密钥计算下会产生不同的密文。很多知名的密码算法都是公开的,密钥才是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大,比如一个8位的密钥最多有256种情况,使用穷举法,能非常轻易的破解。根据密钥的使用方法,密码可分为对称加密和公钥加密。

    3、对称加密

    对称密钥(Symmetric-key algorithm)又称为共享密钥加密,加密和解密使用相同的密钥。常见的对称加密算法有DES、3DES、AES、RC5、RC6。对称密钥的优点是计算速度快,但是它有缺点,接收者需要发送者告知密钥才能解密,因此密钥如何安全的发送给接收者成为了一个问题。

    A 给 B 发送数据时,把数据用对称加密后发送给 B,发送过程中由于对数据进行了加密,因此即使有人窃取了数据也没法破解,因为它不知道密钥是什么。但是同样的问题是 B 收到数据后也一筹莫展,因为它也不知道密钥是什么,那么 A 是不是可以把数据和密钥一同发给 B 呢。当然不行,一旦把密钥和密钥一起发送的话,那就跟发送明文没什么区别了,因为一旦有人把密钥和数据同时获取了,密文就破解了。所以对称加密的密钥配是个问题。如何解决呢,公钥加密是一个办法。

    4、非对称加密

    公开密钥加密(public-key cryptography)简称公钥加密,这套密码算法包含配对的密钥对,分为加密密钥和解密密钥。发送者用加密密钥进行加密,接收者用解密密钥进行解密。加密密钥是公开的,任何人都可以获取,因此加密密钥又称为公钥(public key),解密密钥不能公开,只能自己使用,因此它又称为私钥(private key)。常见的公钥加密算法有 RSA。
    还是以A 给 B 发送数据为例,公钥加密算法由接收者 B 发起

    • B 生成公钥和私钥对,私钥自己保存,不能透露给任何人。
    • B 把公钥发送给 A,发送过程中即使被人窃取也没关系
    • A 用公钥把数据进行加密,并发送给 B,发送过程中被人窃取了同样没关系,因为没有配对的私钥是没法解密的
    • B 用配对的私钥解密。

    HTTPS通信过程

    理解了上面的概念,就要来说说最重要的HTTPS的通信过程,一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步:

    • 1、客户端向服务器发起HTTPS请求,连接到服务器的443端口。

    • 2、服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人,然后将自己的公钥直接发送给客户端。

    • 3、客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性,关于客户端如何验证数字证书的合法性,下文会进行说明。

    • 4、如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。

    • 5、客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。

    • 6、服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。

    • 7、然后服务器将加密后的密文发送给客户端。

    • 8、客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。

    解析上面的8个步骤

    • 服务器给客户端下发公钥,这一步没有什么加密保护,因为即便被人获取了也无所谓,公钥本身就是谁都可以获取的。

    • 客户端每次生成一个随机对称加密密钥,这个密钥用户接下来整个通话过程,这个密钥用服务器公钥加密,只有服务器的私钥才能解密,所以别人即使拦截下来也不可能知道密钥是什么。

    • 服务器接受到客户端的密钥之后就用这个密钥和客户端通信,通信过程就用对称密钥加密,至此就和传统的HTTP通信差不多了,不同的是密钥分发过程是安全的,非对称加密的作用就是用于第一次分发密钥。

    • 为什么不全程都用非对称加密通信呢?原因是效率,毕竟对称加密的速度要快很多,如果每一步通信都用非对称加密,都要校验证书签名,那效率实在太低,用户是不能忍受的。

    数字证书

    通过观察HTTPS的传输过程,我们知道,当服务器接收到客户端发来的请求时,会向客户端发送服务器自己的公钥,但是黑客有可能中途篡改公钥,将其改成黑客自己的,所以有个问题,客户端怎么信赖这个公钥是自己想要访问的服务器的公钥而不是黑客的呢? 这时候就需要用到数字证书。

    在讲数字证书之前,先说一个小例子。假设一个镇里面有两个人A和B,A是个富豪,B想向A借钱,但是A和B不熟,怕B借了钱之后不还。这时候B找到了镇长,镇长给B作担保,告诉A说:“B人品不错,不会欠钱不还的,你就放心借给他吧。” A听了这话后,心里想:“镇长是全镇最德高望重的了,他说B没问题的话那就没事了,我就放心了”。 于是A相信B的为人,把钱借给了B。

    与此相似的,要想让客户端信赖公钥,公钥也要找一个担保人,而且这个担保人的身份必须德高望重,否则没有说服力。这个担保人的就是证书认证中心(Certificate Authority),简称CA。 也就是说CA是专门对公钥进行认证,进行担保的,也就是专门给公钥做担保的担保公司。 全球知名的CA也就100多个,这些CA都是全球都认可的,比如VeriSign、DigiCert、GlobalSign等,国内知名的CA有WoSign。

    那CA怎么对公钥做担保认证呢?CA本身也有一对公钥和私钥,CA会用CA自己的私钥对要进行认证的公钥进行非对称加密,此处待认证的公钥就相当于是明文,加密完之后,得到的密文再加上证书的过期时间、颁发给、颁发者等信息,就组成了数字证书。

    不论什么平台,设备的操作系统中都会内置100多个全球公认的CA,说具体点就是设备中存储了这些知名CA的公钥。当客户端接收到服务器的数字证书的时候,会进行如下验证:

    • 首先客户端会用设备中内置的CA的公钥尝试解密数字证书,如果所有内置的CA的公钥都无法解密该数字证书,说明该数字证书不是由一个全球知名的CA签发的,这样客户端就无法信任该服务器的数字证书。

    • 如果有一个CA的公钥能够成功解密该数字证书,说明该数字证书就是由该CA的私钥签发的,因为被私钥加密的密文只能被与其成对的公钥解密。

    • 除此之外,还需要检查客户端当前访问的服务器的域名是与数字证书中提供的“颁发给”这一项吻合,还要检查数字证书是否过期等。

    通过浏览器直接获取服务器的公钥很容易,各个浏览器操作大同小异。百度现在已经实现了全站点HTTPS,我们就以github为例如何从Chrome中获取其公钥。

    • 用Chrome打开github首页,在https左侧我们会发现有一个绿色的锁头。


    • 点击绿锁区域,出现弹窗,点击证书


    • 点开后就可以看到github网站的证书了


    在常规页面可以看到证书的颁发者,颁发对象和有效期

    • 切换到详细信息页面,可以看到证书的版本号、序列号、签名算法等等


    • 点击右下角的“复制到文件”,导出证书


    • 导出到桌面后,看到就是这样一个文件


    • 切换到“证书路径”面板,可以查看证书的证书链。


    这里先解释一下什么是证书链。前面说到过,DigiCert是一个全球知名的CA,但是一般情况下,CA不会用自己的私钥去直接签名某网站的数字证书,一般CA会首先签发一种证书,然后用这种证书再去签发百度等的数字证书。在此例中,DigiCert签发了下属的DigiCert SHA2 Extended Validation Server CA证书,然后下属证书又签发了github.om,DigiCert位于最顶端,类似于根结点,因此叫做根CA,中间有可能有多个下属CA,这样从根CA到下属CA,再到最终的网站的证书,这样自上而下形成了一条证书链。如果想要查看证书链中的某个证书,只需要选中它,比如选中了DigiCert,然后点击下面的“查看证书”按钮就会弹出另一个对话框,在其中可以查看DigiCert的数字证书,当然也可以将其导出成证书文件保存在硬盘上。

    总结

    以上就是HTTPS的相关内容,下一篇文章再讲下Android中如何使用HTTPS。

    说到这,我想起一个很久前的故事,某日我写了一篇博客,一个心怀梦想的年轻人看了我的博客,并给我打了2块钱的赏,今后几年他事业顺利,婚姻幸福,身体健康,越来越帅,从此走上人生巅峰。

    相关文章

      网友评论

        本文标题:和HTTPS握个手

        本文链接:https://www.haomeiwen.com/subject/stxslxtx.html