HTTP是明文传输的,也就意味着,介于发送端、接收端中间的任意节点均可以知道大家传输的内容是什么。这些节点多是路由器、代理等。html
举个最多见的例子,用户登录。用户输入帐号,密码,采用HTTP的话,只要在代理服务器上作点手脚就能够拿到你的密码了。算法
用户登录 –> 代理服务器(作手脚)–> 实际受权服务器浏览器
在发送端对密码进行加密?没用的,虽然别人不知道你原始密码是多少,但可以拿到加密后的帐号密码,照样能登录。安全
HTTPS其实就是secure http的意思啦,也就是HTTP的安全升级版。稍微了解网络基础的同窗都知道,HTTP是应用层协议,位于HTTP协议之下是传输协议TCP。TCP负责传输,HTTP则定义了数据如何进行包装。服务器
HTTP –> TCP (明文传输)网络
HTTPS相对于HTTP有哪些不一样呢?其实就是在HTTP跟TCP中间加多了一层加密层TLS/SSL。网站
神马是TLS/SSL?ui
通俗的讲,TLS、SSL实际上是相似的东西,SSL是个加密套件,负责对HTTP的数据进行加密。TLS是SSL的升级版。如今提到HTTPS,加密套件基本指的是TLS。加密
传输加密的流程spa
原先是应用层将数据直接给到TCP进行传输,如今改为应用层将数据给到TLS/SSL,将数据加密后,再给到TCP进行传输。
大体如图所示。
就是这么回事。将数据加密后再传输,而不是任由数据在复杂而又充满危险的网络上明文裸奔,在很大程度上确保了数据的安全。这样的话,即便数据被中间节点截获,坏人也看不懂。
对安全或密码学基础有了解的同窗,应该知道常见的加密手段。通常来讲,加密分为对称加密、非对称加密(也叫公开密钥加密)。
对称加密的意思就是,加密数据用的密钥,跟解密数据用的密钥是同样的。
对称加密的优势在于加密、解密效率一般比较高。缺点在于,数据发送方、数据接收方须要协商、共享同一把密钥,并确保密钥不泄露给其余人。此外,对于多个有数据交换需求的个体,两两之间须要分配并维护一把密钥,这个带来的成本基本是不可接受的。
非对称加密的意思就是,加密数据用的密钥(公钥),跟解密数据用的密钥(私钥)是不同的。
什么叫作公钥呢?其实就是字面上的意思——公开的密钥,谁均可以查到。所以非对称加密也叫作公开密钥加密。
相对应的,私钥就是非公开的密钥,通常是由网站的管理员持有。
公钥、私钥两个有什么联系呢?
简单的说就是,经过公钥加密的数据,只能经过私钥解开。经过私钥加密的数据,只能经过公钥解开。
不少同窗都知道用私钥能解开公钥加密的数据,但忽略了一点,私钥加密的数据,一样能够用公钥解密出来。而这点对于理解HTTPS的整套加密、受权体系很是关键。
小明都是某知名社交网站XX的用户,XX出于安全考虑在登录的地方用了非对称加密。小明在登录界面敲入帐号、密码,点击“登录”。因而,浏览器利用公钥对小明的帐号密码进行了加密,并向XX发送登录请求。XX的登录受权程序经过私钥,将帐号、密码解密,并验证经过。以后,将小明的我的信息(含隐私),经过私钥加密后,传输回浏览器。浏览器经过公钥解密数据,并展现给小明。
用非对称加密,就能解决数据传输安全的问题了吗?前面特地强调了一下,私钥加密的数据,公钥是能够解开的,而公钥又是加密的。也就是说,非对称加密只能保证单向数据传输的安全性。
此外,还有公钥如何分发/获取的问题。下面会对这两个问题进行进一步的探讨。
前面举了小明登录社交网站XX的例子,并提到,单纯使用公开密钥加密存在两个比较明显的问题。
浏览器是怎么得到XX的公钥的?固然,小明能够本身去网上查,XX也能够将公钥贴在本身的主页。然而,对于一个动不动就成败上千万的社交网站来讲,会给用户形成极大的不便利,毕竟大部分用户都不知道“公钥”是什么东西。
前面提到,公钥加密的数据,只有私钥能解开,因而小明的帐号、密码是安全了,半路不怕被拦截。
而后有个很大的问题:私钥加密的数据,公钥也能解开。加上公钥是公开的,小明的隐私数据至关于在网上换了种方式裸奔。(中间代理服务器拿到了公钥后,绝不犹豫的就能够解密小明的数据)
下面就分别针对这两个问题进行解答。
这里要涉及两个很是重要的概念:证书、CA(证书颁发机构)。
证书
能够暂时把它理解为网站的身份证。这个身份证里包含了不少信息,其中就包含了上面提到的公钥。
也就是说,当小明、小王、小光等用户访问XX的时候,不再用满世界的找XX的公钥了。当他们访问XX的时候,XX就会把证书发给浏览器,告诉他们说,乖,用这个里面的公钥加密数据。
这里有个问题,所谓的“证书”是哪来的?这就是下面要提到的CA负责的活了。
CA(证书颁发机构)
强调两点:
证书颁发的细节这里先不展开,能够先简单理解为,网站向CA提交了申请,CA审核经过后,将证书颁发给网站,用户访问网站的时候,网站将证书给到用户。
至于证书的细节,一样在后面讲到。
上面提到,经过私钥加密的数据,能够用公钥解密还原。那么,这是否是就意味着,网站传给用户的数据是不安全的?
答案是:是!!!(三个叹号表示强调的三次方)
看到这里,可能你内心会有这样想:用了HTTPS,数据仍是裸奔,这么不靠谱,还不如直接用HTTP来的省事。
可是,为何业界对网站HTTPS化的呼声愈来愈高呢?这明显跟咱们的感性认识相违背啊。
由于:HTTPS虽然用到了公开密钥加密,但同时也结合了其余手段,如对称加密,来确保受权、加密传输的效率、安全性。
归纳来讲,整个简化的加密通讯的流程就是:
注意:对于每一个访问XX的用户,生成的对称密钥B理论上来讲都是不同的。好比小明、小王、小光,可能生成的就是B一、B二、B3.
参考下图:(附上原图出处)
了解了HTTPS加密通讯的流程后,对于数据裸奔的疑虑应该基本打消了。然而,细心的观众可能又有疑问了:怎么样确保证书有合法有效的?
证书非法可能有两种状况:
举个例子:
咱们知道,这个世界上存在一种东西叫作代理,因而,上面小明登录XX网站有多是这样的,小明的登录请求先到了代理服务器,代理服务器再将请求转发到的受权服务器。
小明 –> 邪恶的代理服务器 –> 登录受权服务器
小明 <– 邪恶的代理服务器 <– 登录受权服务器
而后,这个世界坏人太多了,某一天,代理服务器动了坏心思(也有多是被入侵),将小明的请求拦截了。同时,返回了一个非法的证书。
小明 –> 邪恶的代理服务器 –x–> 登录受权服务器
小明 <– 邪恶的代理服务器 –x–> 登录受权服务器
若是善良的小明相信了这个证书,那他就再次裸奔了。固然不能这样,那么,是经过什么机制来防止这种事情的放生的呢。
下面,咱们先来看看”证书”有哪些内容,而后就能够大体猜到是如何进行预防的了。
在正式介绍证书的格式前,先插播个小广告,科普下数字签名和摘要,而后再对证书进行非深刻的介绍。
为何呢?由于数字签名、摘要是证书防伪很是关键的武器。
简单的来讲,“摘要”就是对传输的内容,经过hash算法计算出一段固定长度的串(是否是联想到了文章摘要)。而后,在经过CA的私钥对这段摘要进行加密,加密后获得的结果就是“数字签名”。(这里提到CA的私钥,后面再进行介绍)
明文 –> hash运算 –> 摘要 –> 私钥加密 –> 数字签名
结合上面内容,咱们知道,这段数字签名只有CA的公钥才可以解密。
接下来,咱们再来看看神秘的“证书”究竟包含了什么内容,而后就大体猜到是如何对非法证书进行预防的了。
数字签名、摘要进一步了解可参考 这篇文章。
先无耻的贴上一大段内容,证书格式来自这篇不错的文章《OpenSSL 与 SSL 数字证书概念贴》
内容很是多,这里咱们须要关注的有几个点:
此外,有一点须要补充下,就是:
证书格式
1. 证书版本号(Version) 版本号指明X.509证书的格式版本,如今的值能够为: 1) 0: v1 2) 1: v2 3) 2: v3 也为未来的版本进行了预约义 2. 证书序列号(Serial Number) 序列号指定由CA分配给证书的惟一的"数字型标识符"。当证书被取消时,其实是将此证书的序列号放入由CA签发的CRL中, 这也是序列号惟一的缘由。 3. 签名算法标识符(Signature Algorithm) 签名算法标识用来指定由CA签发证书时所使用的"签名算法"。算法标识符用来指定CA签发证书时所使用的: 1) 公开密钥算法 2) hash算法 example: sha256WithRSAEncryption 须向国际知名标准组织(如ISO)注册 4. 签发机构名(Issuer) 此域用来标识签发证书的CA的X.500 DN(DN-Distinguished Name)名字。包括: 1) 国家(C) 2) 省市(ST) 3) 地区(L) 4) 组织机构(O) 5) 单位部门(OU) 6) 通用名(CN) 7) 邮箱地址 5. 有效期(Validity) 指定证书的有效期,包括: 1) 证书开始生效的日期时间 2) 证书失效的日期和时间 每次使用证书时,须要检查证书是否在有效期内。 6. 证书用户名(Subject) 指定证书持有者的X.500惟一名字。包括: 1) 国家(C) 2) 省市(ST) 3) 地区(L) 4) 组织机构(O) 5) 单位部门(OU) 6) 通用名(CN) 7) 邮箱地址 7. 证书持有者公开密钥信息(Subject Public Key Info) 证书持有者公开密钥信息域包含两个重要信息: 1) 证书持有者的公开密钥的值 2) 公开密钥使用的算法标识符。此标识符包含公开密钥算法和hash算法。 8. 扩展项(extension) X.509 V3证书是在v2的基础上一标准形式或普通形式增长了扩展项,以使证书可以附带额外信息。标准扩展是指 由X.509 V3版本定义的对V2版本增长的具备普遍应用前景的扩展项,任何人均可以向一些权威机构,如ISO,来 注册一些其余扩展,若是这些扩展项应用普遍,也许之后会成为标准扩展项。 9. 签发者惟一标识符(Issuer Unique Identifier) 签发者惟一标识符在第2版加入证书定义中。此域用在当同一个X.500名字用于多个认证机构时,用一比特字符串 来惟一标识签发者的X.500名字。可选。 10. 证书持有者惟一标识符(Subject Unique Identifier) 持有证书者惟一标识符在第2版的标准中加入X.509证书定义。此域用在当同一个X.500名字用于多个证书持有者时, 用一比特字符串来惟一标识证书持有者的X.500名字。可选。 11. 签名算法(Signature Algorithm) 证书签发机构对证书上述内容的签名算法 example: sha256WithRSAEncryption 12. 签名值(Issuer's Signature) 证书签发机构对证书上述内容的签名值
上面提到,XX证书包含了以下内容:
浏览器内置的CA的根证书包含了以下关键内容:
好了,接下来针对以前提到的两种非法证书的场景,讲解下怎么识别
这种状况比较简单,对证书进行检查:
假设代理经过某种途径,拿到XX的证书,而后将证书的公钥偷偷修改为本身的,而后喜滋滋的认为用户要上钩了。然而太单纯了:
上面啰啰嗦嗦讲了一大通,HTTPS如何确保数据加密传输的安全的机制基本都覆盖到了,太过技术细节的就直接跳过了。
最后还有最后两个问题:
上面两个问题,其实就是HTTPS握手阶段要干的事情。HTTPS的数据传输流程总体上跟HTTP是相似的,一样包含两个阶段:握手、数据传输。
阮老师的文章写的很是不错,通俗易懂,感兴趣的同窗能够看下。
附:《SSL/TLS协议运行机制的概述》:http://www.codeceo.com/article/ssl-tls-run.html