【问题标题】:Whose key is used to encrypt a HTTPS response?谁的密钥用于加密 HTTPS 响应?
【发布时间】:2014-06-12 15:58:01
【问题描述】:

我有一个基于 HTTPS 的 Web 服务器。因此,我的服务器维护其私钥并发布任何客户端都可以用来加密其请求的公钥。由于我的服务器是唯一拥有私钥来解密使用服务器公钥加密的任何消息的服务器,因此以这种方式发送的任何请求都可以被认为是安全的。

但是我的问题是在响应部分。当服务器将响应发送回客户端时,服务器将使用谁的公钥来加密响应消息?

我假设服务器将使用客户端的公钥来加密响应(默认情况下?或配置?)。如果是这样,服务器是否从它发送给服务器的请求中知道客户端的公钥,或者以其他方式?

更新: 如果我理解不正确,那么在未来的通信中,每一方如何知道如何解密另一方发送的消息?某些密钥是共享的还是以某种方式共享?

谢谢!

【问题讨论】:

    标签: ssl https public-key-encryption public-key


    【解决方案1】:

    公钥不直接用于加密 HTTPS 连接上的任何底层 HTTP 流量; HTTP 请求和 HTTP 响应都不会以这种方式加密。相反,在初始 SSL 握手期间,客户端和服务器之间会协商会话特定的对称密钥,然后使用对称密钥对 HTTP 连接上双向的所有流量进行加密。

    协商对称密钥的具体机制取决于客户端和服务器之间协商的特定密码套件。这种协商总是涉及到服务器的公钥和客户端发送的一个值;它还可能涉及客户端公钥或来自服务器和客户端的单独连接特定公钥等项目。

    更多细节可以在 RFC 5246 中找到:

    https://www.rfc-editor.org/rfc/rfc5246#section-7.3

    【讨论】:

      【解决方案2】:

      无。

      公钥和私钥用于协商对称加密密钥,该密钥将在该会话期间使用。非对称加密使用两个密钥(私有和公共),对称加密只使用一个。

      您的服务器将其公钥发送给客户端,客户端验证该密钥签名(检查 CA 和所有内容)然后使用它来加密一个随机选择的密钥,该密钥将用作对称加密密钥,并将其发送到服务器。因为只有私钥可以解密该消息,所以消息是安全的,只有服务器可以解密它。然后服务器接受客户端选择的密钥,并开始使用对称加密传输数据。

      为什么会这样?非对称加密在计算上非常昂贵,因此它仅用于确保客户端和服务器可以协商安全的对称密钥,而无需以纯文本形式发送。对称加密很便宜。

      对称加密也是安全的,问题是双方都必须知道密钥才能启动,这是个大问题。通过使用非对称加密来协商密钥,解决了这个问题。

      更新

      嗯,@EJP 似乎不同意我的回答,所以我试图找到更多的文档来简单地解释这件事。

      http://www.techradar.com/news/software/how-ssl-and-tls-works-1047412

      SSL 解释

      当您访问银行的网站时,银行的服务器会自动 在您之前使用 HTTPS 协议将您重定向到其安全站点 可以登录。这将导致您的浏览器和银行的网站 使用 SSL 协商安全通道。

      这个谈判有点像这样(注意我已经简化了它 大大)。浏览器发送一条消息,说明最新版本是什么 它可以支持的 SSL 以及它可以使用的对称算法列表。 Web 服务器发回一条消息,其中包含 SSL 的版本和 将使用的算法。

      它也发送它的证书。客户端验证证书 使用浏览器附带的已知证书;其他 换句话说,它检查它是否已由受信任的 CA 签名,并且它 还没有过期。

      如果证书有效,浏览器会生成一个一次性密钥 会话,用服务器的公钥加密它(它是 证书),并将其发送到服务器。服务器解密 密钥,然后将该密钥与约定的对称算法一起使用 在接下来的会话中。

      我可能会感到困惑。

      【讨论】:

      • 谢谢,vtortola。这很有道理。因此,在非对称加密阶段,当客户端和服务器正在协商用于对称加密的密钥时,实际上是客户端选择双方同意的密钥用于同一会话中的所有未来交互。如果我理解正确,对称加密也是安全的,因为不同的客户端(因此不同的会话)与服务器共享不同的对称加密密钥,因此每个客户端都与服务器保持自己的秘密对话。对吗?
      • 你很困惑,那篇令人震惊的文章的作者也很困惑。这是一个相当普遍的误解,但它仍然是一个误解。 RFC 是关于 SSL 的唯一规范性文件,它指定了我所描述的过程。
      • @EJP 引用 RFC 确实足够好,但对于周围的人来说阅读或理解它也太难了。我在这里看到了你的答案作为你理解它的版本。不否认它的正确性,还有一些模糊的地方,比如“几个方法”,“更多的步骤”等。我还没有得到一个清晰的画面,所以我们不要求一个同样权威的翻译,只是需要一个过程描述更容易理解。你有吗?或者在某个地方有一个与你有相同理解的帖子 - 如果它是正确的,应该有一个。我很想读它。谢谢
      • @EJP 你们俩都回答了“谁的公钥”。现在我发现我理解不正确。但是对于相同的答案,您的解释是不同的。 vtortola 声称在非对称阶段,对称加密密钥是协商和共享的,而您说它根本不传输。如果您的正确,那么我真的需要知道在服务器不知道该密钥的情况下如何进行解密。恕我直言,在 stackoverflow 上有人问“是真的还是假的..?”,所有人采用的答案不太可能是“我告诉你这是真的,但你不会知道为什么这是你自己的问题。 。”
      • 我建议您编辑您现在认为是事实的答案,这样它就可以吸引它可能应得的任何 cmet 和赞成或反对票。或者,如果您想知道真正的正确答案是什么,请提出问题。 SO 的功能不是对您进行错误答案的重新教育。至少这不是我的职责。关于您的最后一句话,您当前答案的倒数第二段是来自外部资源的引文,体现了您的答案目前出现的问题。
      【解决方案3】:

      我的服务器维护它的私钥并发布一个公钥

      是的。

      任何客户端都可以用来加密他们的请求。

      没有。

      由于我的服务器是唯一拥有私钥来解密使用服务器的公钥加密的任何消息的服务器,因此以这种方式发送的任何请求都可以被认为是安全的。

      这不是它的工作原理。

      但是我的问题是在响应部分。当服务器将响应发送回客户端时,服务器将使用谁的公钥来加密响应消息?

      都没有。

      我假设服务器将使用客户端的公钥来加密响应(默认情况下?或配置?)。

      没有。见下文。在大多数 SSL 连接中,服务器甚至不知道客户端的公钥,即使客户端确实有一个。这仅发生在所谓的“相互”SSL 中,其中两个对等方相互进行身份验证。

      如果是这样,服务器是否从它发送给服务器的请求中知道客户端的公钥,或者以其他方式?

      只有当客户端发送它的证书时它才知道公钥,只有在服务器配置为请求它时才会发生这种情况,而通常不是这样。

      HTTPS 通过 SSL 运行,SSL 使用由双方独立协商的对称会话密钥。它永远不会被传输。服务器的密钥对仅用于在其证书上提供数字签名,客户端可以验证该数字签名,从而证明该服务器拥有该证书。从那里开始就是对称协商和加密。

      授权:RFC 2246 和后续版本。

      【讨论】:

      • 您好 EJP,非常感谢您的回答,但我现在很难理解这一点。假设我的客户端通过 HTTPS 调用我的服务,并且,如果我的服务器通过自签名证书运行,那么客户端必须将我的公钥放入信任库中才能与我的服务交互。未来从/向该客户端发送的请求/响应似乎是通过 SSL 层使用 symmetric 会话密钥。没有事先传递信息,双方如何协商这个密钥?
      • 没有。您的客户端必须将您的服务器 certificate 放入其信任库。有几种协商秘密会话密钥的方法。它从一方传达的“预主秘密”开始,但还有几个步骤。有关详细信息,请参阅 RFC。
      • @downvoter 不要自欺欺人。您在这里与 RFC 2246 争论。
      猜你喜欢
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      相关资源
      最近更新 更多