【问题标题】:How are ssl certificates verified?ssl 证书是如何验证的?
【发布时间】:2010-09-16 08:09:24
【问题描述】:

安全验证 ssl 证书所需的一系列步骤是什么?我(非常有限)的理解是,当您访问 https 站点时,服务器会向客户端(浏览器)发送证书,浏览器从该证书中获取证书的颁发者信息,然后使用该信息联系颁发者,并以某种方式进行比较有效性证书。

  • 具体是如何完成的?
  • 如何让它免受中间人攻击?
  • 是什么阻止了一些随机的人设置自己的验证服务以用于中间人攻击,所以一切“看起来”都是安全的?

【问题讨论】:

标签: algorithm security ssl certificate


【解决方案1】:

客户端具有 SSL 证书颁发机构的公钥的预种子存储。必须有一个信任链,从服务器的证书到中间机构,再到所谓的“根”证书之一,才能使服务器受到信任。

您可以检查和/或更改受信任的机构列表。通常,您这样做是为了为您信任的地方当局添加证书 - 例如您工作的公司或您就读的学校等等。

预播种列表可能因您使用的客户端而异。大型 SSL 证书供应商确保他们的根证书存在于所有主要浏览器中 ($$$)。

除非攻击者拥有可信根证书的私钥,否则中间人攻击是“不可能的”。由于相应的证书被广泛部署,这种私钥的暴露通常会对电子商务的安全产生严重影响。因此,这些私钥受到非常非常严密的保护。

【讨论】:

    【解决方案2】:

    这是一个非常简单的解释:

    1. 您的 Web 浏览器会下载 Web 服务器的证书,其中包含 Web 服务器的公钥。此证书使用受信任的证书颁发机构的私钥签名。

    2. 您的网络浏览器安装了所有主要证书颁发机构的公钥。它使用此公钥来验证 Web 服务器的证书是否确实由受信任的证书颁发机构签名。

    3. 证书包含 Web 服务器的域名和/或 IP 地址。您的 Web 浏览器与证书颁发机构确认证书中列出的地址是它与其建立开放连接的地址。

    4. 您的 Web 浏览器会生成一个共享对称密钥,该密钥将用于加密此连接上的 HTTP 流量;这比对所有内容使用公钥/私钥加密要有效得多。您的浏览器使用 Web 服务器的公钥加密对称密钥,然后将其发回,从而确保只有 Web 服务器可以解密它,因为只有 Web 服务器拥有它的私钥。

    请注意,证书颁发机构 (CA) 对于防止中间人攻击至关重要。但是,即使是未签名的证书也会阻止某人被动地监听您的加密流量,因为他们无法访问您的共享对称密钥。

    【讨论】:

    • 在步骤 1.5 附近,服务器还使用与其证书关联的私钥“签署”某些内容。这与名称/IP 检查相结合,以确保只有证书的拥有站点提供它。
    • 要查看使用 Firefox 连接到 amazon.com 的此过程的完整示例,请参阅 moserware.com/2009/06/first-few-milliseconds-of-https.html
    • 我不知道我的浏览器安装了所有主要证书颁发机构的公钥。现在我知道我的 SSL 证书是如何在没有 MITM 风险的情况下得到验证的 :)。谢谢!
    • 服务器需要向 CAuthority 请求证书,所以它向它发送请求。 CA 如何确定服务器是有效的?
    • @voipp:好问题!从历史上看,有一些方法,例如“从webmaster@<domain-being-verified> 发送电子邮件或“将此文件放在您的域中以证明您拥有它。”但是,人们让 CA 为他们的域颁发证书确实存在问题。不要拥有 - 众所周知,有人设法让一个阴暗的 CA 为他们颁发 gmail.com 的证书!
    【解决方案3】:

    值得注意的是,除了购买证书(如上所述),您还可以免费创建自己的;这被称为“自签名证书”。自签名证书和购买的证书之间的区别很简单:购买的证书已由您的浏览器已经知道的证书颁发机构签名。换句话说,您的浏览器可以轻松验证所购买证书的真实性。

    不幸的是,这导致了一种普遍的误解,即自签名证书本质上不如 GoDaddy 和 Verisign 等商业 CA 出售的证书安全,并且如果使用它们,您必须忍受浏览器警告/异常; 这是不正确的

    如果您安全地分发自签名证书(或 CA 证书,如 bobince 建议的那样)并将其安装在将使用您的网站的浏览器中,它与购买的证书一样安全,并且不易受到中间人攻击和证书伪造。显然,这意味着只有少数人需要安全访问您的网站(例如,内部应用程序、个人博客等)才可行。

    【讨论】:

    • 确实,安全地分发您自己的证书是剥皮的一种方法,但更简单的方法是访问许多所谓的“开放”CA 中的任何一个。 CACert.org 是我的最爱。只要您相信他们为保护其证书颁发而采取的步骤,那么导入他们的根证书是安全的。
    • 我喜欢这个评论 - 不幸的是,它突出了 CA 的一个非常重要的弱点。假设您从 Bob Smith 导入 CA 证书 - Bob Smith 可以为任何域(包括 google.com 和chasse.com)签署证书。这实际上就是 GoDaddy/Verisign 支付大笔资金将其包含在操作系统中的原因——它们经过安全机构的审查,以确保他们有适当的检查,以确保他们不会为恶意人员签署证书。我认为您应该可以说“此 CA 只能为 mysite.com 签署证书”。
    • 自签名证书不是更安全吗,因为那里的 CA 可以付费签署他们不应该拥有的东西。如果您可以安全地将 CA 证书分发到端点,请始终使用自签名证书。
    • 在大多数主流浏览器中是否有任何免费且经过验证的 CA?我正在寻找一个基本证书,仅用于验证我拥有电子邮件和域名。不过,我发现的那些不在大多数主流浏览器中。
    • @NathanAdams 在理论上,大型 CA 应该审查请求,以防止如您所描述的那样发布虚假证书......但请阅读这个故事:stripe.ian.sh
    【解决方案4】:

    你说过

    浏览器从中获取证书的颁发者信息 证书,然后使用它来联系颁发者,并以某种方式 比较证书的有效性。

    客户不必与发行人核实,因为有两件事:

    1. 所有浏览器都预装了所有主要 CA 公钥的列表
    2. 证书已签名,并且该签名本身足以证明该证书有效,因为客户端可以自行确保该证书是真实的,而无需联系颁发者的服务器。这就是非对称加密的美妙之处。

    请注意,2. 不能没有 1。

    这在我前段时间做的big diagram中有更好的解释

    (跳到底部的“什么是签名?”)

    【讨论】:

    • 这应该是公认的答案。 @Eli Courtwright 的回答是简短恕我直言,以了解证书的工作原理。
    • 阅读一遍可能还不够,但如果您已经熟悉 SSL 的点点滴滴,这确实可以将所有内容结合在一起。干得好!
    • 梦幻般的形象。最后一些东西可以解释我的问题。我到处深入只是说“浏览器验证证书是正确的”。但它是怎么做到的呢?这给出了答案。
    • 光荣的回答非常感谢!!!!我什至不在乎它是否遗漏了一些细节,据我所知,它完全捕获了所有重要步骤。
    • 这是黄金。它回答了什么?为什么 ?如何?这就是新手想要的堆栈溢出。
    【解决方案5】:

    如果你更注重技术,这个网站可能是你想要的:http://www.zytrax.com/tech/survival/ssl.html

    警告:兔子洞很深:)。

    【讨论】:

      【解决方案6】:

      我知道下面很长,但它很详细,但足够简单。仔细阅读,我保证你会开始发现这个话题并不那么复杂。

      首先,任何人都可以创建 2 个密钥。一个用于加密数据,另一个用于解密数据。前者可以是私钥,而后者可以是公钥,还有 VICERZA。

      其次,简单来说,证书颁发机构 (CA) 提供为您创建证书的服务。如何?他们使用某些值(CA 的颁发者名称、您的服务器的公钥、公司名称、域等)并使用他们的 SUPER DUPER ULTRA SECURE SECRET 私钥并加密此数据。此加密数据的结果是一个签名。

      所以现在 CA 给你一个证书。证书基本上是一个文件,其中包含前面提到的值(CA 的颁发者名称、公司名称、域、服务器的公钥等),包括签名(即后面值的加密版本)。

      现在,说了这么多,这里有一个非常重要要记住的部分:您的设备/操作系统(Windows、Android 等)几乎保留了所有主要/受信任 CA 的列表以及他们的公钥(如果您认为这些公钥用于解密证书中的签名,您是正确的!)。

      好的,如果您阅读了上面的内容,现在这个顺序示例将变得轻而易举:

      1. Example-Company 要求 Example-CA 为他们创建证书。
      2. Example-CA 使用他们的超级私钥签署此证书并将证书提供给 Example-Company。
      3. 明天,互联网用户-Bob 使用 Chrome/Firefox/等。浏览至https://example-company.com。现在的大多数(如果不是全部)浏览器都希望从服务器返回证书。
      4. 浏览器从 example-company.com 获取证书。证书说它是由 Example-CA 颁发的。碰巧 Bob 的操作系统已经在其受信任的 CA 列表中包含了 Example-CA,因此浏览器获取了 Example-CA 的公钥。请记住:这一切都发生在 Bob 的电脑/手机/等设备中,而不是通过网络。
      5. 现在浏览器解密证书中的签名。最后,浏览器将解密的值与证书本身的内容进行比较。 如果内容匹配,则表示签名有效!

      为什么?想想看,只有这个公钥才能解密签名,使内容看起来像私钥加密之前的内容。

      中间人攻击怎么样?

      这是创建上述标准的主要原因之一(如果不是主要原因)。

      假设黑客简拦截了互联网用户鲍勃的请求,并用她自己的证书进行了回复。但是,hacker-Jane 仍然非常小心地在证书中声明颁发者是 Example-CA。最后,黑客简记得她必须在证书上包含一个签名。但是 Jane 使用什么密钥来签署(即创建证书主要内容的加密值)证书??????

      因此,即使黑客 Jane 使用自己的密钥签署了证书,您也可以看到接下来会发生什么。浏览器会说:“好的,这个证书是由 Example-CA 颁发的,让我们用 Example-CA 的公钥解密签名”。解密后,浏览器发现证书内容完全不匹配。因此,浏览器会向用户发出非常明确的警告,并表示它不信任该连接。

      【讨论】:

      • 很好的总结。我还有一个问题。 “最后,hacker-Jane 记得她必须在证书上包含一个签名。” => 服务器发送的证书中的签名是否也不是公开可用的?
      • @SRIDHARAN 我喜欢你的黑客思维 :-) 你可以从原始证书中复制/粘贴签名。但是,Jane 需要解密 Web 流量。唯一的方法是简将她自己的公钥放入证书中。然后浏览器使用该密钥来加密请求。 Jane 使用她的私钥解密流量。如果 Jane 复制/粘贴签名会发生什么: 1. Bob 的浏览器使用 Example-CA 的公钥解密签名 2. 浏览器将解密的签名内容与证书内容进行比较。 3. 浏览器发现公钥不匹配 4. 浏览器告诉 Bob 这是不安全的连接。
      • 感谢您的回复。我正在浏览这些主题。现在我有一个很好的理解。我也将此与 DNS 欺骗混淆了。我在这里找到了完美的答案。 security.stackexchange.com/a/94335.
      • 我在学习HTTPS的时候被教导,服务器的私钥用来解密,公钥用来加密。证书验证的术语是否颠倒了?公钥是指用来解密的密钥,CA的私钥是用来加密的。对吗?
      • 嗨@Guy4444,上述步骤(1-5)部分解释了初始客户端/服务器握手(成功握手=客户端信任服务器)。从这里开始,还有额外的步骤。客户端然后生成一个公钥/私钥对,并将公钥发送给服务器。现在,当服务器向客户端发送“东西”时,它使用客户端的公钥加密,客户端使用其私钥解密,反之亦然。这称为非对称加密。见youtube.com/watch?v=T4Df5_cojAs
      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 2015-06-12
      • 2017-06-13
      • 2019-03-29
      • 2021-02-08
      • 1970-01-01
      • 2014-09-24
      相关资源
      最近更新 更多