如何识别假的SSL证书?

12

我读过有关SSL协议的内容,现在知道它如何加密数据。但是有一件事情我不太明白,使用SSL后,您可以确保将数据发送至正确的服务器并从正确的服务器获取数据。但是如何做到这一点?
我的意思是,如果我创建一个伪造证书并将其发送给特定网站的请求,浏览器(或其他程序)如何检测到伪造证书?

编辑:我并不是想创建自签名证书。我的意思是,如果我创建了一张证书,让其颁发者、主题等与真实证书相同,那么其他人如何验证我的证书呢?(唯一不真实的是公钥和签名)

5个回答

18

TL;DR摘要:

服务器证书的有效性是通过以下方式进行确认的:

  • 主机名验证
  • 验证整个证书链的签名
  • 对每个证书的元数据执行其他检查
  • 检查涉及的每个证书的吊销状态
  • 检查证书链的自签名根证书是否在默认信任的证书中

解释

假设您想连接到https://mail.google.com(您可以在浏览器中尝试!)。

(真实的)服务器将响应一个颁发给mail.google.com的证书。即,在证书的“Subject”字段中,您将找到Common Name(CN)为“mail.google.com”。RFC 5280详细介绍了证书字段的细节。 主题与网站URL相关联的事实对于整个模型的安全非常重要,它由您的TLS实现积极检查(“主机名验证”),因为否则就会有中间人攻击的空间。也就是说,某个人可以获得一个有效的证书,并冒充mail.google.com,而您不会注意到它。

除了主机名验证外,您的TLS实现还将检查证书的“有效性”。整个过程相当复杂,确实包括检查证书的可信性,但还会检查许多其他内容,稍后将详细介绍。

如果您在浏览器中查看Google Mail的证书,您会注意到实际上显示了三个证书:

  • mail.google.com
  • Thawte SGC CA
  • Class 3 Public Primary Certification Authority (VeriSign)
模型是存在一些(很不幸现在数量并不少)受信任的根证书颁发机构(“根CA”),你可以自行选择或者(更可能的情况是)这些机构会与你的软件(例如浏览器)一起预配置,以此作为整个公钥基础设施(PKI)的信任锚点。其基本思想是,受信任的实体可以向其他机构颁发证书,并授权它们再次颁发证书(这些机构称为中间证书颁发机构)。中间CA可以递归地将此程序应用到某一程度,实际末端实体证书和根CA证书之间的中间CA数量通常是有限制的。
在某一点上,中间CA将向“终端实体”(在我们的例子中为“mail.google.com”)颁发证书。现在,颁发证书的过程实际上意味着请求证书的一方首先创建公共/私有密钥对,并使用它们来验证发送给证书颁发机构的证书请求。颁发机构通过使用非对称算法(如RSA)使用自己的私钥“签署”下属实体(中间CA或终端实体)的证书,并在新生成的证书中添加请求方的公钥,从而为下属实体创建证书。根CA拥有所谓的自签名证书,即根CA是唯一可以对其自己的证书进行签署和包含其自己的公钥的权威机构。当然,私钥始终保持隐藏。
证书颁发过程的递归性意味着对于每个终端实体证书,都存在一种独特的建立到根证书颁发机构的证书链的方式。现在,当你尝试连接到TLS安全站点时,将递归地应用以下过程,直到你最终获得根CA证书:
  • 查找颁发要验证的证书的机构的证书(详见RFC 5280)。如果没有找到:出错退出。
  • 使用颁发证书的公钥验证待验证证书的签名。
  • 检查很多其他的事情,比如证书是否过期或者尚未生效,"策略限制","密钥用途","扩展密钥用途"等(详细信息请参见RFC)。
  • 证书吊销状态(稍后会详细介绍)
  • 如果所有检查结果均为正面的,你最终将得到一个自签名证书,即主题也是颁发者的证书(例如我们例子中的VeriSign证书)。现在你需要验证的最后一件事情是,这个证书是否属于你所信任的证书之一:如果是,那么一切都好,连接将成功;如果不是,连接尝试将被拒绝。

    如果这还不够复杂,到目前为止所描述的检查并不能处理曾经有效的证书突然变成恶意的情况,例如证书被盗或私钥被泄露的情况(可以想象Comodo和DigiNotar),对于这些情况,通常的做法是"吊销"这些变坏的证书,也就是从某个特定时间开始将它们标记为无效(它们总会在某个时候过期,但在此期间的剩余时间内,它们已经被标记为无效)。针对这些情况,CA有可能发行CRL(无效证书的目录)或OCSP响应(一个或在极少数情况下一组证书的信息),为客户端提供一个给定证书是否被标记为无效的信息。需要检查链中所有证书的吊销状态,如果其中任何一个被标记为无效,那么最终实体证书就不能被信任,连接也必须被拒绝。


    11
    SSL证书由证书颁发机构(CA)签名,这是用户已经信任的人(更可能是设计他们操作系统的人)。
    CA使用公钥加密数字签名证书。基本解释是,CA有一个“私钥”和一个所有人都知道的“公钥”。通过我不理解的一些数学,CA可以使用其私钥创建一个签名,该签名可以很容易地使用其公钥进行验证(但公钥无法用于创建新的签名)。
    当您从服务器获取SSL证书时,您会获得服务器的公钥以及CA签名证明它是有效的(以及其他一些信息)。如果您知道并信任该CA,您可以检查签名并确定其是否有效。您还可以使用证书吊销列表来确保它未被吊销。
    因此,基本上,您可以识别错误的SSL证书,因为它未经您信任的证书颁发机构签名。

    你的意思是浏览器有公共证书吗? - undone
    @Death - 是的。我认为大多数浏览器都附带了一组CA证书,它们可以用来验证您收到的任何其他SSL证书。例如,请参见此处。您的操作系统可能也有一些。 - Brendan Long
    握手过程:http://publib.boulder.ibm.com/infocenter/tivihelp/v2r1/topic/com.ibm.itame2.doc_5.1/handshak.gif - Arun
    4
    你最后一句话并不是全部情况 - 某些不良的DigiNotar证书也被一个你迄今为止信任的CA签发了。这就是为什么除了检查根CA的签名和信任之外,还必须检查每个证书的吊销状态的重要性所在。请注意,我已经尽力让翻译保持简洁易懂,并尽可能地保留了原意。 - emboss
    @BrendanLong 如果我不信任我的浏览器CA,我想通过查看证书的详细信息并手动验证来验证它,该怎么办?是否有一个网站可以访问,并输入一些我可以从证书中找到的数据来验证证书? - supertonsky
    @supertonsky 你可以这样做,但网站将使用自己的CA列表来验证它(很可能CA列表与您的浏览器中的列表非常相似)。如果您不介意离开软件领域,确定证书是否有效的另一种方法是访问所有者并检查其ID(但现在您需要相信他们的ID是有效的..)。 - Brendan Long

    3
    任何你创建的伪造证书都将是一个自签名证书。
    当连接到使用自签名证书的网站时,浏览器会显示大而可怕的警告但用户往往会忽略这些警告。 为了避免警告,你需要一个由浏览器信任的证书授权机构(如VeriSign)签署的证书。
    这些公司将希望确保你实际拥有他们正在签署的证书的域名。
    关于编辑:如果你想创建一个非自签名证书,你只能从受信任的CA那里获得签名。
    他们将拒绝为不同主题的证书签名。

    6
    实际上,我也可以创建自己的CA来签名(非自签名)服务器证书 - 只是它的证书不会预配置在浏览器中。 - Paŭlo Ebermann
    @PaŭloEbermann说:“它的证书不会预配置在浏览器中。”因此,它将不被信任,并被识别为伪造的。 - Ian Boyd
    1
    @IanBoyd 当然可以。只是根据我理解,它不再是“自签名”证书了。 - Paŭlo Ebermann

    1

    我对流程的理解:

    1. 服务器发送 服务器公钥
    2. 服务器发送 证书(由受信任的CA使用其私钥加密的所有信息)
    3. 您的PC使用内置于操作系统中的公钥解密证书
    4. 您的PC使用 sha1sha256 哈希 服务器公钥
    5. 您的PC将 服务器公钥 的哈希与存储的 证书 的哈希进行比较,如果不同,则浏览器将阻止该站点
    6. 您的PC将允许的域名从 证书 与域名进行比较,如果不允许或不同,则浏览器将阻止该站点
    7. 您的PC将 证书 的有效日期与当前日期进行比较,如果无效,则浏览器将阻止该站点。

    要伪造此过程,您需要:

    • 获得CA私钥(非常难),
    • 成为CA,
    • 成为五眼联盟(政府情报机构联盟)的一部分,并要求CA提供其私钥

    因此,如果您在地址栏中看到一个挂锁,您几乎总是安全的。


    0
    证书之所以有效,是因为它们遵循着一个“信任链”。证书有一个或多个受信任的发行者构成的链条,这正是它能够正常工作的基础。几乎所有浏览器和SSL证书库都会进行这种链条检查,或者至少提供了这个选项。
    自签名证书(或由以自签名证书结尾的链条颁发的证书)将无法通过此检查。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接