This repository has been archived by the owner on Aug 7, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 51
完全理解 HTTPS 如何做到传输安全 #17
Labels
Comments
写的太好了亲 |
谷歌知乎掘金找了两天, 这篇讲的最透彻了!开熏! |
有个疑问:CA怎么将证书下发给服务器的呢? |
Repository owner
deleted a comment from
hulichao
Dec 7, 2018
SSL证书先要向CA机构的,然后部署在服务器上。 |
有个疑问,curl -k是如何进行加密通信的呢,客户端是无法用ca证书解开包含服务端公钥的请求的。 |
问下,Https 对 DNS 劫持也没有办法? |
在 STEP 2: ServerHello 中,由于 Server 给 Client 的消息是明文传输的,其中还包含有公钥,所以中间人可以不篡改,直接获取到公钥代替 Client 发送数据,这不也属于中间人攻击么? |
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
概念
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
名词解释
公钥(yuè)私钥(yuè)
以上是来自维基百科的公钥私钥的定义,HTTPS 是基于非对称加密的,公钥和私钥是整个 HTTPS 的基础。简单来说,公钥是公开的(要不叫公钥),比如小 A 想给我发送加密信息就要他我的公钥,让他用我的公钥对信息进行加密,这个信息只有我的私钥能打开。所以私钥是绝对不能泄漏的,那么私钥只能用来解开公钥吗?并不是,公钥私钥都可以加密和用对方来解密,私钥用来签发数字签名,我用独一无二的私钥签发了一个数字签名,你们都有我的公钥,只有我签发的数字签名能用我的公钥解开,才能证明这个签名发自我。
知乎上有个回答特别精辟:
Diffie–Hellman
笔者本人并没很仔细理解这个算法的原理,但是作为前端在实际应用中只需要知道这个加密算法的作用就好了,中间就是黑箱。简单来说这个算法的作用就是:Alice 和 Bob 各自有对方的公钥(当然其他人也有),Alice 和 Bob 再产生一个随机数(不告诉别人),然后用两个人的公钥和自己手里的随机数产生两个数 A B,然后它们交换这两个数,每个人可以用自己手头的随机数和交换得来的数再次计算,两个人得到的数是一样的,就得到了一个共享密钥。
在知乎上找到一个这个共享秘钥计算过程的描述
(1)Alice与Bob确定两个大素数n和g,这两个数不用保密
(2)Alice选择另一个大随机数x,并计算A如下:A=gxmod n
(3)Alice将A发给Bob
(4)Bob 选择另一个大随机数y,并计算B如下:B=gymod n
(5)Bob将B发给Alice
(6)计算秘密密钥K1如下:K1=Bxmod n
(7)计算秘密密钥K2如下:K2=Aymod n K1=K2,因此Alice和Bob可以用其进行加解密
因此,client 和 server 可以“离线“计算出一份只有对方知道的秘钥。
数字证书
包含的内容有:
其中,在加密过程中最重要的是公开密钥和数字签名算法,前者用来生成 session key,后者是验算 hash 的方法。
CA
在 CA 给服务端颁发证书的同时会产生一个私钥和公钥。私钥由服务端自己保存,不可泄漏。公钥则是附带在证书的信息中,可以公开的。证书本身也附带一个证书电子签名,这个签名用来验证证书的完整性和真实性,可以防止证书被串改。
流程
SSL协议分为两部分:Handshake Protocol 和 Record Protocol。其中 Handshake Protocol 用来协商密钥,协议的大部分内容就是通信双方如何利用它来安全的协商出一份密钥。 Record Protocol 则定义了传输的格式。
相比对称加密,非对称加密的速度比较慢,所以它一般用于密钥交换,双方通过公钥算法协商出一份密钥,然后通过这个密钥对称加密来通信,充分结合这两者的优势。
STEP 1: ClientHello
首先,由客户端向服务端发起一个明文的无保护的请求,用来初始化 SSL(这里的客户端只是一个职责的代号,代表"首先发送信息的一方",对前端来说,就是浏览器)。
message 中包含以下内容:
这个随机数是会在后面中用到的,其他的是用来标明客户端支持的特性的。
STEP 2: ServerHello
服务端收到客户端发来的信息,返回给客户端自己的信息,message 中包括
这里要说一下数字证书与数字签名,数字证书这个东西是向第三方机构去申请的。
数字签名用来保证数字证书没有被篡改过,因为数字签名是用 CA 的私钥来加密的,如果第三方篡改了签名是无法用 CA 的公钥解密的(就伪装不下去了),数字签名也是 CA 给的。
数字签名的过程如下,使用证书中的数字签名算法计算证书的一个 HASH 值,然后 CA 用私钥给加密,然后给服务端,服务端保管好即可。
最后服务器发送 Server Hello Done 报文通知客户端, 最初阶段的 SSL握手协商部分结束,客户端应该发送信息了。
STEP 3: 客户端回应
验证证书
客户端根据证书中的数字签名算法计算出数字证书的 HASH,再用本地的 CA 公钥(浏览器厂商会内置根证书,可以通过证书链将服务端的证书用内置的根证书认证)。解密出数字签名的 HASH,比较一致则表明这确实是未被篡改过的数字证书。到这一步,客户端已经成功拿到了服务端的证书。
回应服务端
证书
客户端的证书,如果服务端需要的话会发送(比如某些网银需要 U 盾来生成证书验证客户端的身份)。
ClientKeyExchange
如果服务端需要对客户端进行验证,在客户端收到服务端的 Server Hello 消息之后,首先需要向服务端发送客户端的证书,让服务端来验证客户端的合法性。
CertificateVerify
如果证书没有问题,客户端就会从服务器证书中取出服务器的公钥来加密以下信息回应服务端:
ChangeCipherSpec
ChangeCipherSpec 是一个独立的协议,体现在数据包中就是一个字节的数据,用于告知服务端,客户端已经切换到之前协商好的加密套件(Cipher Suite)的状态,准备使用之前协商好的加密套件加密数据并传输了。它标志着从客户端之后发出的信息将使用 shared secret 来进行加密。
Finished
在ChangecipherSpec传输完毕之后,客户端会使用之前协商好的加密套件和 shared secret 加密一段 Finish 的数据传送给服务端,此数据是为了在正式传输应用数据之前对刚刚握手建立起来的加解密通道进行验证。
STEP 4: 服务端回应
在这一步,服务端无论如何将得到 pre-master key,但是 SSL 有几种不同的交换密钥的算法,由 cipher suite 来决定,每种密钥交换算法需要不同的公钥来推倒,这里介绍两种:
不管用哪种方法,服务端和客户端现在都已经持有 pre-master key 后,使用私钥进行解密获得 pre-master key。再加上自己手上的 server_random 和 client_random,然后客户端和服务端会使用一个 PRF (Pseudo-Random Function) 算法来产生 master-secret。
再由 master-secret 推导出 session-key(也称 shared-secret),这是双方后续通信用来最终加密的对称密钥。
一切准备好之后,服务端也回应客户端一个自己的用 session-key 加密的 ChangeCipherSpec,标明自己之后的信息也将使用 session-key 来加密。之后,服务端也会使用 session-key 加密一段 Finish 消息发送给客户端,以验证之前通过握手建立起来的加解密通道是否成功。
STET 6: HTTPS 通信
根据之前的握手信息,服务器和客户端的 Finished 报文交换完毕之后,如果客户端和服务端都能对 Finish 信息进行正常加解密且消息正确的被验证,则说明 SSL 连接就算建立完成。接下来,双方可以进行应用层的通信,使用上面产生的 session-key 对 HTTP 进行加密传输了。
在以上流程中, 应用层发送数据时会附加一种叫做 MAC( Message Authentication Code) 的报文摘要。 MAC 能够查知报文是否遭到篡改, 从而保护报文的完整性。
总结
最后放上一张图来总结整个 SSL 的过程,其中加密方式采用的是 RSA,但是整个流程是思路是一致的。
其实 HTTPS 要复杂的多,本文介绍的过程是简化了的,主要是理清如何安全获得对称公钥。
via The SSL/TLS Handshake: an Overview
GOOD & BAD
放上 HTTPS 的好处与坏处,via https是什么?使用https的好处与不足?
好处
正是由于 HTTPS 非常的安全,攻击者无法从中找到下手的地方,从站长的角度来说,HTTPS 的优点有以下2点:
SEO 方面
谷歌曾在 2014 年 8 月份调整搜索引擎算法,并称"比起同等 HTTP 网站,采用 HTTPS 加密的网站在搜索结果中的排名将会更高”。
安全性
尽管 HTTPS 并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS 仍是现行架构下最安全的解决方案,主要有以下几个好处:
不足
虽然说 HTTPS 有很大的优势,但其相对来说,还是有些不足之处的,具体来说,有以下2点:
SEO 方面
据 ACM CoNEXT 数据显示,使用 HTTPS 协议会使页面的加载时间延长近50%,增加 10% 到 20% 的耗电,此外,HTTPS 协议还会影响缓存,增加数据开销和功耗,甚至已有安全措施也会受到影响也会因此而受到影响。
而且 HTTPS 协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。
最关键的,SSL 证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。
经济方面
参考
RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?
Diffie-Hellman密码交换是如何运作的?
迪菲-赫尔曼密钥交换
公开密钥认证
SSL/TLS原理详解
https的pre-master-secret到master-secret的过程?
Differences between the terms “pre-master secret”, “master secret”, “private key”, and “shared secret”?
How does SSL/TLS work?
What's the point of the pre-master key? [duplicate]
The SSL/TLS Handshake: an Overview
图解 HTTP
The text was updated successfully, but these errors were encountered: