如何验证ssl证书?

rcr*_*ick 188 security algorithm ssl certificate

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

  • 究竟是怎么做到的?
  • 该过程如何使其免受中间人攻击?
  • 是什么阻止了一些随机的人建立自己的验证服务以用于中间人攻击,所以一切"看起来"安全?

Eli*_*ght 268

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

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

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

  3. 证书包含Web服务器的域名和/或IP地址.您的Web浏览器向证书颁发机构确认证书中列出的地址是具有打开连接的地址.

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

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

  • 要使用连接到https://www.amazon.com的Firefox查看此过程的完整工作示例,请参阅http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html (62认同)
  • 我不知道我的浏览器安装了所有主要证书颁发机构的公钥.现在我知道如何在没有MITM风险的情况下验证我的SSL证书:).谢谢! (9认同)
  • 服务器需要从CAuthority请求证书,因此它向它发送请求.CA如何确定服务器是否有效? (4认同)
  • 此答案缺少步骤,其中证书或信任链中的所有证书应根据颁发 CA 的证书吊销列表进行验证。这是使用 CRL 或 OCSP 完成的。另外,浏览器生成对称密钥不是(服务器)证书的一部分的步骤是验证。它是建立 TLS 会话的一部分。 (4认同)
  • 在步骤1.5周围,服务器还使用与其证书相关联的私钥"签名"某些内容.这与名称/ IP检查相结合,以确保只有证书的拥有站点才能显示它. (3认同)
  • @voipp:好问题!从历史上看,有一些方法,例如"从'webmaster @ <domain-being-verified>'发送电子邮件或"将此文件放在您的域名上以证明您拥有它."但是,确实存在人们的问题让CA为他们不拥有的域颁发证书 - 着名的是有人设法让一个阴暗的CA为他们颁发gmail.com证书! (3认同)
  • "您的网络浏览器安装了所有主要证书颁发机构的公钥." 谁来决定什么被认为是"主要证书颁发机构"?如果我正在使用的证书颁发机构的公钥没有预先安装在我的浏览器上,那么我的浏览器是否不能在不打开中间人攻击的情况下获取公钥? (2认同)
  • 奇怪的是,我不认为这是问题的答案……你在#2 中写的基本上就是他要问的内容。换句话说:服务器提供的证书中包含 CA 的公钥如何帮助验证证书?任何证书(甚至是恶意证书)都不能包含 CA 的公钥吗? (2认同)
  • @EliCourtwright `“它使用这个公钥来验证 Web 服务器的证书确实是由受信任的证书颁发机构签名的。”`但是它如何验证呢?它对具有表明其真实性的已知公钥的消息做了什么? (2认同)

Cli*_*ris 51

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

不幸的是,这导致了一种常见的误解,即自签名证书本身就不如GoDaddy和Verisign等商业CA销售的证书,如果你使用它们,你必须忍受浏览器警告/例外; 这是不正确的.

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

为了提高认识并鼓励像我这样的小型博主自我保护自己,我写了一个入门级教程,更详细地解释了证书背后的概念以及如何安全地创建和使用自签名证书(包括代码示例和屏幕截图).

  • 我喜欢这条评论 - 不幸的是,它凸显了CA的一个非常重要的弱点.假设您从Bob Smith导入CA证书 - Bob Smith可以为任何域(包括google.com和chase.com)签署证书.这实际上是为什么GoDaddy/Verisign支付大笔资金才能被纳入操作系统 - 他们会被安全机构审查,以确保他们有适当的检查以确保他们不会为恶意人员签署证书.我认为您应该可以说"此CA只能为mysite.com签署证书". (5认同)
  • 事实上,安全地分发您自己的证书是剥皮猫的一种方法,但更简单的方法是使用许多所谓的“开放”CA 中的任何一个。CACert.org 是我的最爱。只要您信任他们为保护其证书颁发而采取的步骤,那么导入其根证书就是安全的。 (3认同)

ych*_*che 28

你之前这么说

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

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

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

请注意,如果没有1,则无法完成.

在我前一段时间制作的这个大图中可以更好地解释这一点

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

BLOB

  • 这应该是公认的答案.@Eli Courtwright的答案是简短地了解证书如何运作. (6认同)
  • 太棒了。最后有一些东西可以解释我的问题。我去深入的每一个地方都只是说“浏览器验证证书是正确的”。但它是怎么做到的呢?这给出了答案。 (2认同)
  • 光荣的回答非常感谢!!!!我什至不在乎它是否遗漏了一些细节,据我所知,它完全捕获了所有重要步骤。 (2认同)

Fra*_*hes 11

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

首先,任何人都可以创建 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. 明天,互联网用户鲍勃使用 Chrome/Firefox/等。浏览到https://example-company.com。现在大多数(如果不是全部)浏览器都希望从服务器返回证书。
  4. 浏览器从 example-company.com 获取证书。证书说它是由 Example-CA 颁发的。碰巧 Bob 的操作系统已经在其可信 CA 列表中包含 Example-CA,因此浏览器获取 Example-CA 的公钥。请记住:这一切都发生在 Bob 的计算机/移动设备/等设备中,而不是通过网络。
  5. 所以现在浏览器解密证书中的签名。最后,浏览器将解密的值与证书本身的内容进行比较。如果内容匹配,则表示签名有效!

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

中间人攻击怎么样?

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

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

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

  • 很好的总结。我还有一个问题。“最后,黑客简记得她必须在证书上包含签名。” =&gt; 在服务器发送的证书中签名是否也不能公开? (3认同)
  • @SRIDHARAN 我喜欢你的黑客思维:-)你可以复制/粘贴原始证书中的签名。然而,Jane 需要解密网络流量。唯一的方法是 Jane 将她自己的公钥放入证书中。然后浏览器使用该密钥来加密请求。Jane 使用她的私钥来解密流量。如果 Jane 复制/粘贴签名,会发生什么情况: 1. Bob 的浏览器使用 Example-CA 的公钥来解密签名 2. 浏览器将解密后的签名内容与 cert 的内容进行比较。3. 浏览器注意到公钥不匹配 4. 浏览器告诉 Bob 这是不安全的连接。 (2认同)

nsa*_*yer 8

客户端有预先存储的SSL证书颁发机构的公钥.服务器的证书必须有一条信任链​​,通过中间权限直到一个所谓的"根"证书,以便服务器受信任.

您可以检查和/或更改受信任的权限列表.通常,您这样做是为您信任的地方当局添加证书 - 例如您所在的公司或您就读的学校或不参加的学校.

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

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


Mik*_*ger 7

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

警告:兔子洞深入:).