为何要有HTTPS,简单的回答是“由于HTTP不安全”。算法
一般认为,若是通讯过程当中具有了四个特性,就能够认为是“安全”的,这四个特性是:机密性、完整性、身份认证和不能否认。浏览器
HTTPS为HTTP增长了刚才所说的四大安全特性。安全
HTTPS实际上是一个”很是简单“的协议,RFC文档很小,只有短短的7页,里面规定了新的协议名”https“,默认端口号443,至于其余的什么请求-应答模式、报文结构、请求方法、URI、头字段、链接管理等等都彻底沿用HTTP,没有任何新的东西。服务器
那HTTPS怎么作到机密性、完整性这些安全特性的呢?网络
秘密就在于HTTPS名字里的”S“,它把HTTP下层的传输协议由TCP/IP换成了SSL/TLS,由”HTTP over TCP/IP“变成了”HTTP over SSL/TLS“,让HTTP运行在了安全的SSL/TLS协议上,收发报文再也不使用Socket API,而是调用专门的安全接口。 session
SSL即安全套接层(Secure Sockets Layer),在OSI模型中处于第5层(会话层),由网景公司于1994年发明,有v2和v3两个版本,而v1由于有严重的缺陷从未公开过。dom
SSL发展到v3时已经证实了它自身是一个很是好的安全通讯协议,因而互联网工程组IETF在1999年把它更名为TLS(传输层安全,Transport Layer Security),正式标准化,版本号从1.0从新算起,因此TLS1.0实际上就是SSLv3.1。ide
到今天TLS已经发展出了三个版本,分别是2006年的1.一、2008年的1.2和2018年的1.3,每一个新版本都紧跟密码学的发展和互联网的现状,持续强化安全和性能,已经成为了信息安全领域中的权威标准。函数
目前应用的最普遍的 TLS 是 1.2,而以前的协议(TLS1.1/1.0、SSLv3/v2)都已经被认为是不安全的,各大浏览器即将在 2020 年左右中止支持,因此接下来的讲解都针对的是 TLS1.2。工具
TLS由记录协议、握手协议、警告协议、变动密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术。
浏览器和服务器在使用TLS创建链接时须要选择一组恰当的加密算法来实现安全通讯,这些算法的组合被称为”密码套件“(cipher suite,也叫加密套件)。TLS的密码套件命名很是规范,格式很固定。基本的形式是”密钥交换算法+签名算法+对称加密算法+摘要算法“。例如“ECDHE-RSA-AES256-GCM-SHA384”的意思是“握手时使用 ECDHE 算法进行密钥交换,用 RSA 签名和身份认证,握手后的通讯使用 AES 对称算法,密钥长度 256 位,分组模式是 GCM,摘要算法 SHA384 用于消息认证和产生随机数。”
说到TLS,就不能不谈到OpenSSL,它是一个著名的开源密码学程序库和工具包,几乎支持全部公开的加密算法和协议,已经成为事实上的标准,许多应用软件都会使用它做为底层库来实现TLS功能,包括经常使用的Web服务器Apache、Nginx等。OpenSSL是著名的开源密码学工具包,是SSL/TLS的具体实现。
实现机密性最经常使用的手段是”加密“(encrypt),就是把消息用某种方式转换成谁也看不懂的乱码,只有掌握特殊”钥匙”的人才能再转换出原始文本。
这里的“钥匙”就叫作“密钥”(key),加密前的消息叫“明文”(plain text/clear text),加密后的乱码叫“密文”(cipher text),使用密钥还原明文的过程叫“解密”(decrypt),是加密的反操做,加密解密的操做过程就是“加密算法”。
全部的加密算法都是公开的,任何人均可以去分析研究,而算法使用的“密钥”则必须保密。因为HTTPS、TLS都运行在计算机上,因此“密钥”就是一长串的数字,但约定俗成的度量单是”位“(bit),而不是”字节“(byte)。好比,说密钥长度是128,就是16字节的二进制串,密钥长度1024,就是128字节的二进制串。
对称加密就是指加密和解密时使用的密钥是同一个,是”对称“的。只要保证了密钥的安全,那整个通讯过程就能够说具备了机密性。
TLS里有很是多的对称加密算法可供选择,好比RC四、DES、3DES、AES、ChaCha20等,但前三种算法都被认为是不安全的,一般都禁止使用,目前经常使用的只有AES和ChaCha20。
AES的意思是”高级加密标准“(Advanced Encryption Standard),密钥长度能够是12八、192或256。它是DES算法的替代者,安全强度很高,性能也很好,并且有的硬件还会作特殊优化,因此很是流行,是应用最普遍的对称加密算法。
ChaCha20是Google设计的另外一种加密算法,密钥长度固定为256位,纯软件运行性能要超过AES,曾经在移动客户端上比较流行,但ARMv8以后也加入了AES硬件优化,因此如今再也不具备明显的优点,但仍然算得上是一个不错的算法。
对称算法还有一个”分组模式“的概念,它可让算法用固定长度的密钥加密任意长度的明文,把小秘密(密钥)转化为大秘密(即密文)。
最新的分组模式被称为AEAD(Authenticated Encryption ),在加密的同时增长了认证的功能,经常使用的是GCM、CCM和Poly1305。
把上面这些组合起来,就能够获得TLS密码套件中定义的对称加密算法。
好比,AES128-GCM,意思是密钥长度为128位的AES算法,使用的分组模式是GCM;ChaCha20-Poly1305的意思是ChaCha20算法,使用的分组模式是Poly1305。
对称加密看上去好像完美地实现了机密性,但其中有一个很大的问题:如何把密钥安全地传递给对方,术语叫”密钥交换“。
因此,就出现了非对称加密(也叫公钥加密算法)。 它有两个密钥,一个叫”公钥“(public key),一个叫”私钥“(private key)。两个密钥是不一样的,”不对称“,公钥能够公开给任何人使用,而私钥必须严格保密。
公钥和私钥有个特别的”单向“性,虽然均可以用来加密解密,但公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密。
非对称加密能够解决”密钥交换“的问题。网站秘密保管私钥,在网上任意分发公钥,你想要登陆网站只要用公钥加密就好了,密文只能由私钥持有者才能解密。
非对称加密算法的设计要比对称算法难的多,在TLS里只有不多的几种,好比DH、DSA、RSA、ECC等。
RSA多是其中最著名的一个,几乎能够说是非对称加密的代名词,它的安全性基于”整数分解“的数学难题,使用两个超大素数的乘积做为生成密钥的材料,想要从公钥推算出私钥是很是困难的。
ECC(Elliptic Curve Cryptography)是非对称加密里的“后起之秀”,它基于“椭圆曲线离散对数”的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于密钥交换,ECDSA 用于数字签名。
比起 RSA,ECC 在安全强度和性能上都有明显的优点。160 位的 ECC 至关于 1024 位的 RSA,而 224 位的 ECC 则至关于 2048 位的 RSA。由于密钥短,因此相应的计算量、消耗的内存和带宽也就少,加密解密的性能就上去了,对于如今的移动互联网很是有吸引力。
非对称加密虽然没有”密钥交换“的问题,但由于它们都是基于复杂的数学难题,运算速度很慢,即便是ECC也要比AES差上好几个数量级。若是仅使用非对称加密,虽然保证了安全,但通讯速度过慢没有实用性。
混合加密方式就是把对称加密和非对称加密结合起来呢,二者互相取长补短,即能高效地加密解密,又能安全地密钥交换:
在通讯刚开始的时候使用非对称算法,好比RSA、ECDHE,首先解决密钥交换的问题。
而后用随机数产生对称算法使用的”会话密钥“(session key),再用公钥加密。由于会话密钥很短,一般只有16字节或32字节,因此慢一点也无所谓。
对方拿到密文后用私钥解密,取出会话密钥。这样,双方就实现了对称密钥的安全交换,后续就再也不使用非对称加密,全都使用对称加密。
加密实现了机密性,但仍没法保证完整性和身份认证等特性
实现完整性的手段主要是摘要算法(Digest Algorithm),也就是常说的散列函数、哈希函数(Hash Function)。
你能够把摘要算法近似地理解成一种特殊的压缩算法,它可以把任意长度的数据”压缩“成固定长度、并且独一无二的”摘要“字符串,就好像是给这段数据生成了一个数字”指纹“。也能够把摘要算法理解成特殊的”单向“加密算法,它只有算法,没有密钥,加密后的数据没法解密,不能从摘要逆推出原文。
由于摘要算法对输入具备”单向性“和”雪崩效应“,输入的微小不一样会致使输出的剧烈变化,因此也被TLS用来生成伪随机数(PRF,pseudo random function)。
MD5(Message-Digest 5)、SHA-1(Secure Hash Algorithm 1)就是最经常使用的两个摘要算法,可以生成16字节和20字节长度的数字摘要。但这两个算法的安全强度比较低,不够安全,在TLS里已经被禁止使用了。
目前TLS推荐使用的是SHA-1的后继者:SHA-2。SHA-2其实是一系列摘要算法的统称,总共有6种,经常使用的有SHA22四、SHA25六、SHA384,分别可以生成28字节、32字节、48字节的摘要。
摘要算法保证了”数字摘要“和原文是彻底等价的。因此,咱们只要在原文后附上它的摘要,就可以保证数据的完整性。
不过摘要算法不具备机密性,若是明文传输,那么黑客能够修改消息后把摘要也一块儿改了。因此,真正的完整性必需要创建在机密性之上,在混合加密系统里用会话密钥加密消息和摘要,这样黑客就没法得知明文了。
这有个术语,叫哈希消息认证码(HMAC)。
加密算法结合摘要算法,咱们的通讯过程能够说是比较安全了。但这里仍是有漏洞,就是通讯的两个端点(endpoint)。黑客能够假装网站来窃取消息,也能够假装为你,向网站发送支付、转帐等消息。
那么,在数字世界里如何证实你的身份呢?因为非对称加密里的”私钥“只能由本人持有,那么使用私钥再加上摘要算法,就可以实现”数字签名“,同时实现”身份认证“和”不能否认“。
数字签名的原理其实很简单,就是把公钥私钥的用法反过来,以前是公钥加密,私钥解密,如今是私钥加密、公钥解密。但又由于非对称加密效率过低,因此私钥只加密原文的摘要,这样运算量就小的多,并且获得的数字签名也很小,方便保管和传输。
签名和公钥同样彻底公开,任何人均可以获取。但这个签名只有用私钥对应的公钥才能解开,拿到摘要后,再比对原文验证完整性,就能够像签署文件同样证实消息确实是你发的。
刚才的这两个行为也有专用术语,叫作”签名“和”验签“。
只要你和网站互相交换公钥,就能够用”签名“和”验签“来确认消息的真实性,由于私钥保密,黑客不能伪造签名,就可以保证通讯双方的身份。
综合使用对称加密、非对称加密和摘要算法,咱们已经实现了安全的四大特性。但这里还有一个”公钥的信任“问题。由于谁均可以发布公钥,咱们还缺乏防止黑客伪造公钥的手段。
咱们能够用相似密钥交换的方法来解决公钥认证问题,用别的私钥来给公钥签名,显然,这又会陷入”无穷递归“。
此次实在是”没招“了,要终结这个”死循环“,就必需要引入”外力“,找一个公认的可信第三方,让它做为”信任的起点,递归的终点“,构建起公钥的信任链。
这个”第三方“就是咱们常说的CA(Certificate Authority,证书认证机构)。它就像网络世界里的公安局、教育局、公证中心,具备极高的可信度,由它来给各个公钥签名,用自身的信誉来保证公钥没法伪造,是可信的。
CA对公钥的签名认证也是有格式的,不是简单地把公钥绑定在持有者身份上就完事了,还要包含序列号、用途、颁发者、有效时间等等,把这些打成一个包再签名,完整地证实公钥关联的各类信息,造成”数字证书“(Certificate)
知名的CA全世界就那么几家,好比DigiCert、VeriSign、Entrust、Let's Encrypt等,它们签发的证书分DV、OV、EV三种,区别在于可信程度。
DV是最低的,只是域名级别的可信,背后是谁不知道。EV是最高的,通过了法律和审计的严格核查,能够证实网站拥有者的身份(在浏览器地址栏会显示出公司的名字,例如Apple、Github的网站)。
不过,CA怎么证实本身呢?
这仍是信任链的问题。小一点的CA可让大CA签名认证,但链条的最后,也就是Root CA,就只能本身证实本身了,这个就叫”自签名证书“(Self-Signed Certificate)或者”根证书“(Root Certificate)。你必须相信,不然整个证书信任链就走不下去了。
证书体系(PKI,Public Key Infrastructure)虽然是目前整个网络世界的安全基础设施,但绝对的安全是不存在的,它也有弱点,仍是关键的”信任“二字。
若是CA失误或者被欺骗,签发了错误的证书,虽然证书是真的,可它表明的网站倒是假的。
还有一种更危险的状况,CA被黑客攻陷,或者CA有恶意,由于它(即根证书)是信任的源头,整个信任链里的全部证书也就都不可信了。
因此,须要再给证书体系打上一些补丁。
针对第一种,开发出了CRL(证书吊销列表,Certificate revocation list)和OCSP(在线证书状态协议,Online Certificate Status Protocol),及时废止有问题的证书。
对于第二种,由于涉及的证书太多,就只能操做系统或者浏览器从根上”下狠手“了,撤销对CA的信任,列入”黑名单“,这样它颁发的全部证书就都会被认为是不安全的。
Q:你能说出 HTTPS 与 HTTP 有哪些区别吗?
Q:你知道有哪些方法可以实现机密性、完整性等安全特性呢?
Q:加密算法中“密钥”的名字很形象,你能试着用现实中的锁和钥匙来比喻一下吗?
Q:在混合加密中用到了公钥加密,由于只能由私钥解密。那么反过来,私钥加密后任何人均可以用公钥解密,这有什么用呢?
Q:为何公钥可以创建信任链,用对称加密算法里的对称密钥行不行呢?
Q:假设有一个三级的证书体系(Root CA=> 一级 CA=> 二级 CA),你能详细解释一下证书信任链的验证过程吗?