HTTPS(SSL)的工作原理是什么?

58

我一直在了解HTTPS,试图弄清楚它的确切工作原理。对我来说似乎没有意义,例如,我正在阅读这个链接:

https://ssl.trustwave.com/support/support-how-ssl-works.php

并且注意到页面中说:

步骤4: xyz.com将创建一个唯一的哈希值,并使用客户端的公钥和xyz.com的私钥进行加密,然后将其发送回客户端。

步骤5:客户端的浏览器将解密哈希值。此过程表明xyz.com发送了哈希值,并且只有客户能够读取它。

我不明白的是,黑客难道不可以拦截发送给“客户端浏览器”的公钥,并能够解密客户端能够读取的任何内容吗?

感谢任何回复。


1
阅读http://en.wikipedia.org/wiki/Public-key_cryptography。 - nos
3
您可能希望从一份有更多细节的文件中了解。Trustwave指南在虚晃手势上很强,信息方面则较弱。 - sarnold
1
选择更好、更详细的描述。例如阅读我们的文章 - Eugene Mayevski 'Callback
@sarnold,同意,它不仅“信息不足”,在一些地方实际上是错误的。没有客户端证书(这里超出范围),就没有“客户的公钥”(+在使用客户端证书时也不会使用)。当“使用私钥加密”时,还存在加密和签名之间的混淆。我无法理解他们在第3步中的意思。 - Bruno
1
在@nos提供的维基百科链接中,查看“邮政类比”部分;我之前读了很多,但这个类比让所有事情都变得清晰明了! - Emad Alashi
1
步骤4和5是不正确的。哈希值并没有被加密或解密,而是使用服务器的私钥进行签名。哈希值仅用于验证服务器拥有发送的公钥。 - user207421
6个回答

122

为什么需要使用HTTPS?

为了验证网站是否经过身份认证/认证(未经认证的网站可能会做出恶意行为)。经过身份认证的网站拥有从CA之一购买的独特个人证书。

什么是CA(证书颁发机构)?

CA是全球值得信赖的公司,如GoDaddy、GeoTrust、VeriSign等,它们向网站提供数字证书。

什么是公钥和私钥?

密钥只是用于加密/解密数据的长随机数字。
公钥是可以与他人共享的密钥。私钥应该保密。

假设Jerry生成了一个私钥和公钥。他制作了许多公钥的副本并与其他人分享。
现在,其他人只能使用公钥加密数据,而该数据只能由Jerry的私钥解密。
另一种方法是仅使用公钥解密数据,并使用私钥仅加密数据。

公司如何获得证书?

网站所有者首先生成公钥和私钥,保持私钥机密。他将 证书签名请求文件 (CSR) 和他的 公钥 提供给 CA。
CA 根据 CSR 创建个人证书,包括域名、所有者名称、到期日期、序列号等,并在证书中添加一个 加密文本 (= 数字签名),最后使用服务器的公钥加密整个证书并将其发送回网站所有者。
然后,该证书使用网站所有者的私钥进行解密,最终安装在网站上。

注意:那个加密文本是 CA 的数字签名。该文本由 CA 的 私钥 加密,只能使用 CA 的公钥进行解密。
当您安装操作系统或浏览器时,会附带许多受信任的 CA(如 GeoTrust、VeriSign、GoDaddy)的根证书。这些根证书包含该 CA 提供商的公钥,有助于解密签名。


HTTPS安全性可以分为两个部分(握手):
1. 验证网站证书的有效性:

enter image description here

1) 当您输入网址www.Google.com时,Google的服务器会向浏览器提供其公钥和证书(由GeoTrust签名)。

2) 现在浏览器必须验证证书的真实性,即它是否真正来自GeoTrust。 由于浏览器预装了所有主要CA的公钥列表,因此它选择GeoTrust的公钥,并尝试解密由GeoTrust的私钥加密的证书的数字签名。

3) 如果它能够解密签名(这意味着它是一个值得信任的网站),则继续进行下一步,否则停止并在URL前显示红色交叉符号。

2. 创建安全连接(加密出站和入站数据),以便其他人无法阅读:

enter image description here

1)如我所述,当您输入www.Google.com时,Google会发送其公钥。使用此公钥加密的任何数据只能由Google不与任何人共享的私钥解密。

2)验证证书后,浏览器创建一个新密钥,我们称之为会话密钥并制作两个副本。这些密钥可以加密和解密数据

3)然后,浏览器使用Google的公钥加密(1个会话密钥副本+其他请求数据)。然后将其发送回Google服务器。

4)Google的服务器使用其私钥解密加密的数据,并获取会话密钥和其他请求数据。

现在,请注意,服务器和浏览器都获得了浏览器的相同副本的会话密钥。没有其他人拥有此密钥,因此只有服务器和浏览器可以加密和解密数据。现在,此密钥将用于解密和加密数据。

5)当Google向浏览器发送请求的HTML文档和其他HTTP数据时,它首先使用此会话密钥加密数据,浏览器使用另一个会话密钥副本解密数据。

6) 同样地,当浏览器将数据发送到Google服务器时,它使用会话密钥进行加密,服务器在另一侧解密。

注意:此会话密钥仅用于该会话。如果用户关闭网站并重新打开,则会创建新的会话密钥。


您对网络永远都不会感到厌倦吗?当您在浏览器中输入www.google.com时的幕后故事


7
这段话的意思是:会话可以跨越多个TCP连接并持续存在。关于加密和发送会话密钥,并在服务器端解密的部分是完全错误的。会话密钥根本不会被传输:它是通过安全的密钥协商算法建立的。在发布这样的无意义内容之前,请核实你的事实。RFC 2246。 - user207421
3
好的,这应该被选为最佳答案。写得非常详细清晰。 - SimpleGuy
3
好的,Jerry,非常精准。谢谢。 - Mona
2
有人能复制CA的加密数字签名并创建伪造证书吗? - alizeyn
显示剩余4条评论

28
我不明白的是,一个黑客不是可以拦截发送给“客户浏览器”的公钥,从而能够解密客户能够解密的任何内容吗?
首先,要了解HTTPS通信通常有两个步骤。
1. 生成一个只有客户端和服务器知道的共享对称密钥(也称为会话密钥)。 2. 使用这个共享对称密钥,客户端和服务器可以安全地相互通信,不用担心信息被他人拦截和解密。
所以问题变成了,客户端和服务器如何在这个开放的互联网上生成一个不被他人知道的秘密共享密钥?这就是非对称算法发挥作用的地方,一个演示流程如下:
- 客户端从服务器接收到公钥。
-- 客户端生成一个密钥字符串 "DummySharedKey",该字符串将作为共享密钥,并使用服务器的公钥加密为 "7$&^^%####LDD!!@"。中间人可能拥有公钥并能够拦截加密数据,但对他来说数据是无用的,因为只有服务器的私钥才能解密数据。
-- 服务器接收到加密的密钥字符串 "7$&^^%####LDD!!@",并使用私钥解密为 "DummySharedKey"。
上述密钥交换步骤确保只有客户端和服务器知道共享密钥是 "DummySharedKey",其他人不知道。
因此,重要的是要理解生成共享密钥的责任在客户端,而不是服务器!(我认为这是让您感到困惑的原因)
我还建议你看一下这个视频,它很好地解释了HTTPs。 https://www.youtube.com/watch?v=JCvPnwpWVUQ&list=FLt15cp4Q09BpKVUryBOg2hQ&index=3

2
关于加密和发送会话密钥以及在服务器上解密的部分是完全胡说八道。会话密钥根本没有被传输:它是通过安全密钥协商算法建立的。在发布这样的无稽之谈之前,请核实您的事实。RFC 2246。 - user207421
6
没有人告诉你如何礼貌地回复?! - Frank Zhang
我已经阅读了文档,它说会话密钥是生成并传输的。 - Frank Zhang
1
请引用实际的文本来说明。它并不存在。会话密钥从未被传输。你是不是和这里的其他人一样混淆了与预主密钥? - user207421

21
“我不明白的是,黑客难道不能拦截发送回“客户浏览器”的公钥,然后能够解密客户端可以解密的任何东西吗?”
公钥/私钥加密是基于使用质数的模算术运算。
这种非对称加密仅在1970年代中期被发现。它归功于Diffie和Hellman以及Rivest,Shamir和Adleman。(但实际上,两者都重新发现了已知的事情,由英国秘密服务掌握。) Diffie-Hellman的维基百科页面详细介绍了通过公共渠道进行秘密密钥交换的示例。虽然它没有描述SSL本身,但它应该有助于理解为什么知道公钥不会揭示消息的内容。
您可能还会发现这个simple RSA example有趣。

5

1
会话密钥永远不会被传输。继续学习。 - user207421

1

我写了一篇关于服务器/客户端之间SSL握手的小博客文章。请随意查看。

SSL握手

以下是同一文章的一个小片段:

"客户端通过HTTPS向服务器发出请求。服务器发送其SSL证书+公钥的副本。在使用其本地可信CA存储验证服务器身份后,客户端生成一个秘密会话密钥,使用服务器的公钥对其进行加密并发送。服务器使用其私钥解密秘密会话密钥并向客户端发送确认。安全通道建立."

它还描述了在建立安全传输后用于SSL证书和数据传输的对称/非对称加密。


我非常喜欢你的帖子,内容非常清晰。谢谢。 - Carlos Alberto
关于加密和发送会话密钥以及在服务器上解密的部分完全是胡说八道。会话密钥根本没有被传输:它是通过安全密钥协商算法建立的。在发布这样的无稽之谈之前,请核实您的事实。RFC 2246。 - user207421

0

关于SSL的详细解释,请参见https://www.ietf.org/rfc/rfc2246.txt

以下是有关SSL的简要说明,以回答您的问题:

1)使用证书进行身份验证。服务器证书是必须的,客户端证书是可选的(仅当服务器请求时)。证书就像是证明您是谁的东西,它还包含用于非对称加密的公钥。

2)使用非对称加密(使用服务器证书中的公钥)来建立共享对称密钥,该密钥用于通过对称加密在客户端和服务器之间安全地传输数据(出于性能原因,对称加密比非对称加密更快)。

共享的对称密钥是通过交换来自客户端的预主密钥(使用服务器公钥加密),并且从预主密钥、客户端随机数和服务器随机数一起派生而来(感谢@EJP指出这一点):

master_secret = PRF(pre_master_secret, "master secret",
                           ClientHello.random + ServerHello.random)

我们需要服务器随机数和客户端随机数来防止重放攻击,攻击者可以捕获先前的会话并在新会话中重放。

我不明白的是,黑客不是可以拦截发送给“客户浏览器”的公钥,并能够解密客户能解密的任何内容吗?

黑客无法解密消息,因为他不知道服务器的私钥。请注意,公钥不能用于解密消息。


1
客户的公钥没有加密(通常甚至没有公钥)。那份文件是错误的。 - Bruno
在SSL通信中,公钥用于加密私钥(会话密钥),然后使用对称加密传输数据(出于性能考虑,因为对称加密比非对称加密更快)。 - Khanh TO
1
客户端使用服务器的公钥来加密预主密钥(在RSA密钥交换模式下)。然后它们都知道相同的主密钥,该密钥用于生成相同的共享密钥:http://tools.ietf.org/html/rfc5246#appendix-F.1.1.2 - Bruno
在对称加密中,客户端和服务器确实共享密钥,但它被称为“共享”或“对称”密钥,而不是“私有”密钥。 “私有”密钥是指非对称加密中的私有密钥。 - Bruno
1
当然,SSL/TLS使用非对称加密来建立共享密钥(从而为对称加密算法生成加密密钥),但是在此上下文中,客户端的公钥(如果有)从未用于加密任何内容。 - Bruno
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接