我已经阅读了SSL协议,现在我知道它是如何加密数据的。但有些事我不明白。使用SSL,您可以确保向正确的服务器发送数据和从正确的服务器获取数据。但如何?
我的意思是,如果我创建一个假证书并将其发送给特殊网站的请求,浏览器(或其他程序)如何检测到假证书?
编辑:我并不是要创建一个自签名证书。我的意思是,如果我创建一个证书,它的发行者和主题等都是真正的证书,那么别人怎么能验证我的证书呢?(唯一不真实的是公钥& &;签名)
TL;DR summary:
服务器证书的有效性通过以下方式建立:
- 主机名验证
- 验证整个证书链的签名
- 对每个证书的元数据执行额外检查
- 检查相关证书的撤销状态
- 检查链的自签名根证书是否在默认信任的证书中
解释让我们假设您想要连接到https://mail.google.com(您可以在浏览器中尝试!)。
(真实)服务器将响应颁发给mail.google.com
的证书,即在证书的"主题"字段中,您将找到通用名称(CN)。'mail.google.com' -有关证书字段的详细信息,请参阅RFC 5280。主题链接到站点URL的事实对于整个模型的安全性非常重要,并且由您的TLS实现("主机名验证")主动检查,因为否则就会有中间人攻击的空间。也就是说,有人可以在你没有注意到的情况下获得一个其他有效的证书并冒充mail.google.com。
除了主机名验证之外,您的TLS实现还将检查证书的"有效性"。整个过程相当复杂,确实包括检查证书的可信度,但除此之外还会检查许多其他事情,稍后会详细介绍。
如果您在浏览器中查看Google Mail的证书,您会注意到实际上有三个证书:
- mail.google.com
- Thawte SGC CA
- 第三类公共主认证机构(VeriSign)
模型是有一些(不幸的是不再那么少)受信任的根证书颁发机构("根ca"),您可以自己选择,或者(更有可能)与您的软件(例如浏览器)一起预先配置,它们是盲目信任的。这些可信的权威机构构成了"PKI"(公钥基础设施)的整个信任模型的锚。其基本思想是,受信任实体可以向其他权威机构颁发证书,并授予它们再次颁发证书的权限(这些权威机构称为中间证书权威机构)。中间CA可以再次递归地应用此过程,直到某一点,在实际的最终实体证书和根CA证书之间的中间CA的数量通常是有限的。
在某一点上,中间CA将向"终端实体"(在我们的示例中为"mail.google.com")颁发证书。现在,颁发证书的过程实际上意味着请求证书的一方将首先创建一个公钥/私钥对,并使用它们对发送给证书颁发机构的证书请求进行身份验证。颁发机构为从属实体(中间CA或终端实体)创建证书,方法是使用非对称算法(如RSA)使用自己的私钥对该证书进行"签名",并在新生成的证书中额外包含请求方的公钥。根CA拥有所谓的自签名证书,即根CA是唯一可以签署自己的证书并包含自己的公钥的权威机构。当然,私钥在任何时候都是隐藏的。
证书颁发过程的递归性质意味着,对于每个终端实体证书,都有一种独特的方式来建立通向根证书颁发机构的证书"链"。现在,当您在尝试连接到tls安全站点时获得终端实体证书时,将递归地应用以下过程,直到您最终获得根CA证书:
- 查找颁发要验证的证书的机构的证书(详见RFC 5280)。
- 获取颁发证书的公钥,使用该公钥验证待验证证书的签名。
- 检查很多额外的东西,比如证书是否没有过期,是否还无效,"策略约束","密钥用法","扩展密钥用法"…(同样,血腥的细节在RFC中)。
- 证书撤销状态(稍后详细说明)
如果所有检查都是积极的,您最终将得到一个自签名的证书,即主题也是颁发者(例如我们示例中的VeriSign证书)。现在,您必须验证的最后一件事是该证书是否属于您盲目信任的证书:如果是,则一切正常,连接将成功;如果不是,则连接尝试将被拒绝。
似乎这还不够复杂,到目前为止所描述的检查并不能处理曾经有效的证书突然变成恶意证书的情况,例如证书被盗或私钥被泄露的情况(想想Comodo和DigiNotar)。在这些情况下,正常的过程是"撤销"那些坏了的证书,也就是说,您希望从一个不同的时间点开始将它们标记为无效(它们无论如何都会在某个时间点过期,但在该期限的剩余时间内,它们应该已经被标记为无效)。对于这些情况,ca有可能发出crl(一个声明为无效的证书目录)或OCSP响应(一个证书的信息,在极少数情况下是一组证书的信息),这些响应向客户端提供给定证书是否已被标记为无效的信息。需要检查链中所有证书的撤销状态,如果其中一个证书被标记为无效,则终端实体证书不能被信任,并且连接也必须被拒绝。
SSL证书由证书颁发机构(CA)签名,该机构是用户已经信任的人(或者更可能是设计操作系统的人)。
CA使用公钥加密对证书进行数字签名。基本的解释是CA有一个人人都知道的"私钥"和一个"公钥"。通过一些我不理解的数学,CA可以使用它的私钥创建一个签名,这个私钥可以很容易地用它的公钥进行验证(但是公钥不能用来创建一个新的签名)。
当您从服务器获得SSL证书时,您将获得服务器的公钥和CA的签名,说明它是有效的(以及其他一些信息)。如果您知道并信任该CA,则可以检查签名并确定其是否有效。您也可以使用证书吊销列表来确保它没有被吊销。
所以基本上,你可以识别出一个坏的SSL证书,因为它不是由你信任的证书颁发机构签名的。
您创建的任何假证书都将是自签名的证书。
当连接到带有自签名证书的网站时,浏览器会显示可怕的大警告,用户会立即忽略。
为了避免警告,您需要一个由浏览器信任的证书颁发机构(如VeriSign)签名的证书。
这些公司将希望确保您实际上拥有他们正在签署的证书的域名。
Re:编辑:如果您从受信任的CA处获得签名,则只能创建非自签名证书。
他们将拒绝为不同主题的证书签名。
过程从我的理解:
- 服务器发送
servers public key
- 服务器发送
certificate
(所有由可信CA用私钥加密的信息) - 您的PC使用公钥解密证书(从受信任的CA内置到操作系统)
- 您的PC哈希(
sha1
和sha256
)servers public key
- 你的电脑比较
servers public key
的哈希值与certificate
存储的哈希值,如果不是相同的浏览器将阻止站点 - 你的电脑比较
certificate
允许的域名和域名,如果不允许,如果不是相同的浏览器将阻止网站 - 你的电脑比较
certificate
的有效日期和你的日期,如果不有效,浏览器将阻止网站。
要设置这个,你需要:
- 获取CA私钥(极难获取),
- 是CA,
- 成为5 eyes(政府情报机构联盟)的一部分,并要求CA提供他们的私钥
所以如果你在地址栏看到一个挂锁,你几乎总是安全的。
证书之所以有效,是因为它们遵循信任链。证书具有由一个或多个可信发行者组成的链;这条链是它运作的支柱。浏览器和几乎所有SSL证书库都执行此链检查,或者至少提供选项。
自签名证书(或由以自签名证书结束的链颁发的证书)将无法通过此检查。