【问题标题】:Does browser not validate digital signature in case of Self signed certificate如果是自签名证书,浏览器是否不验证数字签名
【发布时间】:2019-04-18 16:31:08
【问题描述】:

在以下用例中,我对 SSL 证书流程的理解是否正确(CA/自签名)。 一般我们生成SSL证书的时候有以下内容 :

  • 所有者、域、有效性等详细信息。
  • Web 服务器的公钥(用于非对称密钥对 SSL 握手)
  • 由 CA 私钥签名的数字签名或在自我签名的情况下,它将是 Web 服务器自己的私钥(希望这种理解是正确的?(Q1))

第一个 Web 浏览器使用自己的公钥获取 SSL 证书。 CA 提供者证书存在时的证书验证:

  1. 浏览器将拥有 CA 的所有公钥,因此可以验证 数字签名。
  2. 稍后Web服务器提供的公钥用于启动对称密钥加密。

但是博客也谈到浏览器已经有受信任的根证书并且它可以验证。这是否意味着很多时候浏览器只检查证书内容而没有数字签名验证(Q2)?

现在,在自签名的情况下,Web 服务器将使用自己的私钥来登录证书(而不是 CA 私钥)。在第一次浏览器交互期间,它将发送其证书以及 Web 服务器公钥。所以在这种情况下,我们在证书签名期间使用相同的公钥/私钥对,并共享对称密钥以进行数据加密(Q3)??

现在,博客说我们可以在浏览器上手动导入证书。证书导入也会导入公钥以验证签名是否正确(Q4)? 博客说如果证书存在于受信任的根证书中,则认为它是有效的。这是否意味着浏览器不进行签名验证(Q5)?

有没有人帮助我理解 Q1 到 Q5。我错过了什么吗?

【问题讨论】:

    标签: ssl https ssl-certificate


    【解决方案1】:

    由 CA 私钥签名的数字签名或在自我签名的情况下,它将是 Web 服务器自己的私钥(希望这种理解是正确的?(Q1))

    正确。服务器的证书将由 CA 证书(根 CA 或更常见的中间 CA)签名。如果是自签名证书,则服务器的证书和 CA 是同一个证书。

    1. 稍后Web服务器提供的公钥用于启动对称密钥加密。

    这仅适用于 RSA 密钥交换。使用 RSA Kx,pre-master secret 由客户端创建,使用服务器的公钥加密并发送到服务器。然后,客户端和服务器都从这个预主密钥派生所有对称密钥。

    RSA 密钥交换已被弃用,并在 TLS 1.3 中被移除。相反,应该使用 Diffie Hellman 密钥交换。使用 DH Kx,服务器证书和内部的公钥仅用于验证服务器,以防止中间人攻击,但不参与密钥交换。

    但是博客也谈到浏览器已经有受信任的根证书并且它可以验证。这是否意味着很多时候浏览器只检查证书内容而没有数字签名验证(Q2)?

    服务器发送服务器(叶)证书和可能的中间证书,然后浏览器创建从叶证书到本地根证书(信任锚)的信任链。如果无法创建这样的信任链,则证书不受信任。哪些 CA 证书用作信任锚取决于客户端:像 Firefox 这样的浏览器带有自己的信任库,其他浏览器使用系统信任库,其他客户端使用另一个信任库(即 Java 自带)。详情请见SSL Certificate framework 101: How does the browser actually verify the validity of a given server certificate?

    现在在自签名的情况下,......所以在这种情况下,我们在证书签名期间使用相同的公钥/私钥对并共享对称密钥以进行数据加密(Q3)??

    对于自签名证书,证书的颁发者和证书本身就是证书本身,即用于签署证书的私钥与证书内的公钥匹配。在 RSA 密钥交换的情况下,此密钥还涉及创建对称密钥(见上文)。

    证书导入也会导入公钥以验证签名是否正确(Q4)?

    公钥是证书的一部分(但私钥不是)。因此,证书导入也将隐式导入公钥。

    博客说如果证书存在于受信任的根证书中,则认为它是有效的。这是否意味着浏览器不做签名验证(Q5)?

    根证书被认为是受信任的,因为它在本地信任存储中,而不是因为它是由某些东西签名的。这就是为什么签名验证与根证书并不真正相关的原因。要作为信任锚正常工作,SSL/TLS 库通常仍需要根证书是正确(自)签名的证书。

    【讨论】:

    • 非常感谢您的详细解释。 :)
    【解决方案2】:

    你的帖子很难听,但我会努力的。

    如果在浏览器中安装了 CA 的根证书,证书将根据颁发证书颁发机构 (CA) 进行验证。

    对于自签名证书,是 CA。

    如果您创建证书并为您的 CA 导入证书,您使用它创建的证书将受到信任。如果您不导入 CA 的证书,您的证书将不受信任。

    但是博客也谈到浏览器已经有受信任的根证书并且它可以验证。

    浏览器信任的 CA 的初始根证书集由浏览器的发布者安装。这意味着,例如,全新安装的 Chrome 将信任由 Verisign 颁发的您银行的 SSL 证书,而不是您的自签名证书。

    一旦您从自己的 CA 安装了根证书,您的浏览器就会像信任威瑞信一样信任您的证书。

    至于你标题中的问题,浏览器必须验证签名。如果没有,它就会被破坏,这将是一个巨大的安全漏洞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-16
      • 2011-09-22
      • 2020-03-15
      • 2021-05-04
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多