【问题标题】:How does the client verify servers certificate in SSL?客户端如何在 SSL 中验证服务器证书?
【发布时间】:2016-05-24 07:18:32
【问题描述】:

我阅读了很多关于这个主题的内容,所有“详细”的解释似乎都错过了一步:

为了让客户端验证服务器,它做了以下事情(根据我的理解):

  1. 它从服务器获取证书。证书将包含公钥和数字签名。

2?) 客户端使用公钥验证签名是否正常。

这就是我感到困惑的原因。说我是中间的那个人。我可以连接到服务器并获取服务器提供给我的任何信息,然后将其转发给客户端。客户如何知道谁实际出示了证书?

以下是我也知道的一般情况:

  1. 客户端知道公钥。它用它加密一条消息并将其发送到服务器。

  2. 服务器知道私钥,解密消息,然后发回。

  3. 现在客户端可以与服务器共享对称密钥了。

  4. 中间的人可以在场,但没关系,因为没有私钥就无法解密数据。

那么这与证书中的(静态?)数字签名有何关系?

请帮助我理解该特定步骤(验证签名)。

【问题讨论】:

  • >>我可以连接到服务器并获取服务器提供给我的任何信息,然后将其转发给客户端 - 是的,但只有拥有私钥的人才能解密它
  • 我明白这一点。这与“验证签名”有何关系?
  • 要签署证书你需要私钥,所以没有原始私钥你不能创建我知道的有效签名
  • 但是如果证书中的签名对于所有连接到服务器的人来说都是静态的,那么我总是知道答案会是什么。
  • 签名存储在 CA 以验证分配给 "this" crt 的 "this" 域名/ip 和所有内容是否正确。

标签: ssl-certificate


【解决方案1】:

关于流程,我想我可以为您回答这个问题。

  1. 客户端发送一个 TLS 请求,其中包含有关它可以支持的信息。

  2. 服务器收到它并说我可以支持它并提供由 Verisign 或 Go Daddy 等签名的公钥和服务器证书。

  3. 客户端收到它,验证其本地信任存储中的基于有效性的信息,创建一个包含在服务器公钥中的密钥返回给服务器,然后它们形成一个安全的加密通道。 为了让某些人进入 MITM,他们需要拥有带有确切 CN、位置、城市和站点名称等的 CA 根签名证书,这应该是不可能的,因为 CA 没有分配双证书。

【讨论】:

    【解决方案2】:

    一开始,您向证书颁发机构 (CA) 请求证书 通过提供 CSR(由域详细信息和服务器的公钥组成)。

    然后CA将通过以下步骤颁发数字证书:

    1. CSR 使用哈希算法签名,即 SHA256/md5 生成哈希(CSR)

    2. 然后使用其签名者私钥之一对散列后的 CSR 进行加密。即,加密(哈希(CSR))

    3. 然后加密(hash(CSR))附加到CSR,我们可以称之为数字证书

    数字证书 = CSR + 加密(hash(CSR))


    证书验证:

    服务器在建立 TLS 连接时向用户代理发送证书。

    然后用户代理(浏览器)查看证书,检查证书是否来自受信任的 CA。

    如果它来自受信任的 CA,那么用户代理会解析证书,我们将在其中获得 CSR 和加密(哈希(CSR))。

    1. 现在我们使用散列算法创建 CSR 的散列,我们生成散列(CSR)。

    2. Encrypted(hash(CSR)) 使用 CA 的公钥解密。由此,我们将得到 hash(CSR)。

    如果步骤 4 中的 hash(CSR) == 步骤 5 中的 hash(CSR),则验证证书。

    有关 TLS 中的密码套件和协商过程的更多详细信息,请参阅 TLS 握手过程。

    【讨论】:

    • 请注意格式化您的答案。我稍微修正了布局和语法,但我并没有说答案是否正确。
    【解决方案3】:

    进一步挖掘后,我发现了我缺少的东西。

    服务器提供带有签名的证书文件。我缺少的是“数字签名算法”或类似的算法。

    假设 P 是公钥,R 是私钥。

    基本上,如果 H 是输入,R 是私钥,我们会得到 C 作为输出。

    由于C是数字签名算法的结果,我们可以使用公共P​​和输出C来获得H。

    这回答了我的问题的原因是: 假设有人伪装成服务器并且能够准确地重放 C。当然证书看起来是有效的,但是 C 不能继续进行,因为进一步的消息将使用公共 P 加密。

    这是我从未见过的答案。

    我在这里找到了信息: http://www.jscape.com/blog/what-is-a-digital-signature

    【讨论】:

    • 我了解我们拥有来自受信任 CA 的公钥,该公钥可以解密来自 www.somewebsite.com(我们正在与之握手)的身份证书中包含的数字签名。 www.somewebsite.com 独有的数字签名中包含哪些信息(如果有)?换句话说,是什么阻止我们复制数字签名并在另一个(假)网站的证书上使用它?我看到提到我们从数字签名中获得的哈希码,但是用那个哈希码加密了什么让我们可以信任 www.somewebsite.com?
    • 在此处查看第 3.4 节:robertheaton.com/2014/03/27/how-does-https-actually-work。 “但是,当客户端加密将用于实际数据加密的密钥时,它将使用来自该真实证书的真实 Microsoft 公钥”,假设 Microsoft 是服务器。当然,您可以窃取证书,但只要客户端使用证书中的公钥,您将无法解密任何内容,这对应于您没有窃取的秘密私钥
    • 我专门询问了数字签名。我在这里security.stackexchange.com/a/129172en.wikipedia.org/wiki/Digital_signature#How_they_work 找到了我的问题的答案。简而言之,为整个证书创建了一个消息摘要并嵌入到数字签名中。这使得数字签名对于证书是唯一的。只有 CA 的公钥才能解密这个数字签名,这就是验证有效性的方式,也是信任链中最终环节的建立方式。
    • 如果消息摘要是作为证书的函数创建的,那么创建此消息摘要的函数的输入参数(如果您愿意的话)到底是什么?我想输入来自证书中的数据,不是吗?这些输入到底是什么?这是我仍然很好奇的具体点。谢谢。
    猜你喜欢
    • 2013-02-08
    • 2015-10-20
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多