我读过有关SSL协议的内容,现在知道它如何加密数据。但是有一件事情我不太明白,使用SSL后,您可以确保将数据发送至正确的服务器并从正确的服务器获取数据。但是如何做到这一点?
我的意思是,如果我创建一个伪造证书并将其发送给特定网站的请求,浏览器(或其他程序)如何检测到伪造证书?
编辑:我并不是想创建自签名证书。我的意思是,如果我创建了一张证书,让其颁发者、主题等与真实证书相同,那么其他人如何验证我的证书呢?(唯一不真实的是公钥和签名)
我读过有关SSL协议的内容,现在知道它如何加密数据。但是有一件事情我不太明白,使用SSL后,您可以确保将数据发送至正确的服务器并从正确的服务器获取数据。但是如何做到这一点?
我的意思是,如果我创建一个伪造证书并将其发送给特定网站的请求,浏览器(或其他程序)如何检测到伪造证书?
编辑:我并不是想创建自签名证书。我的意思是,如果我创建了一张证书,让其颁发者、主题等与真实证书相同,那么其他人如何验证我的证书呢?(唯一不真实的是公钥和签名)
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的证书,您会注意到实际上显示了三个证书:
如果所有检查结果均为正面的,你最终将得到一个自签名证书,即主题也是颁发者的证书(例如我们例子中的VeriSign证书)。现在你需要验证的最后一件事情是,这个证书是否属于你所信任的证书之一:如果是,那么一切都好,连接将成功;如果不是,连接尝试将被拒绝。
如果这还不够复杂,到目前为止所描述的检查并不能处理曾经有效的证书突然变成恶意的情况,例如证书被盗或私钥被泄露的情况(可以想象Comodo和DigiNotar),对于这些情况,通常的做法是"吊销"这些变坏的证书,也就是从某个特定时间开始将它们标记为无效(它们总会在某个时候过期,但在此期间的剩余时间内,它们已经被标记为无效)。针对这些情况,CA有可能发行CRL(无效证书的目录)或OCSP响应(一个或在极少数情况下一组证书的信息),为客户端提供一个给定证书是否被标记为无效的信息。需要检查链中所有证书的吊销状态,如果其中任何一个被标记为无效,那么最终实体证书就不能被信任,连接也必须被拒绝。
我对流程的理解:
服务器公钥
证书
(由受信任的CA使用其私钥加密的所有信息)sha1
和 sha256
哈希 服务器公钥
服务器公钥
的哈希与存储的 证书
的哈希进行比较,如果不同,则浏览器将阻止该站点证书
与域名进行比较,如果不允许或不同,则浏览器将阻止该站点证书
的有效日期与当前日期进行比较,如果无效,则浏览器将阻止该站点。要伪造此过程,您需要:
因此,如果您在地址栏中看到一个挂锁,您几乎总是安全的。