主机名匹配 。
链条是完整的——每个中间体都存在,每个证书都签下一个,并且都会导致上方有一个证书.
日期不错 而浏览器仍然把门关上:每个堆都用自己的口音说出.
Chrome和Edge说。
Firefox说——或者当叶子自己签字时.
卷发说。
节点说或.
Python)说.
OpenSSL打印(或作自签名叶).
一个根源,许多方言:客户端一直跟随链条到上方,不承认坐在那里的权威.
这和两者的失败不同 最常被混淆 这不是一个名称不匹配(主机名是好的),而——微妙的——它不仅仅是一个不完整的链条.
一个缺失的中间体会打破一条通往客户端会信任的根的路径;这是客户端到达根并拒绝它.
链条可以是完美的,仍然会以一个锚为终点,客户永远不会接受.
Trust Is About the Anchor, 而不是路径证书验证会做两件独立的事情, 很容易将它们拼接起来.
首先它建立了一个路径: 叶 → 中间(s) → 根,每个连接由下一条上签名.
然后它检查那条路径上方的锚-根-是否是它已经信任的锚-因为它在客户端的信托商店(OS或浏览器根程序)上行,它的公钥被烤入.
一个不完整的链路错误是路径失败:客户端无法组装链接,通常是因为服务器没有发送中间体.
是锚失败: 路径很好, 客户端到达了顶端, 而上面的证书则不在它咨询过的任何信托商店中 。
没有多少添加中间件可以修正——你可以把一个美丽的完整的链条交给客户,并且它仍然会拒绝它,因为完整性不等同于被固定在一个可信赖的根上.
这就是一句话中的全部错误:客户端将链条建到它不信任的根上.
问题从来不是"这链子完成了吗?" 亦能现相.
问题是"这个链条是否终止在客户已经信任的根上?"——当答案是否定时,你得到,不管根下的所有东西看起来多么整齐.
实际上是什么导致它 粗略的顺序 他们咬的频率: 一个自签名的证书。
叶子是自己签的;根本没有单独的CA.
内部仪表板、电器、IOT设备 装箱 以及30秒内所有的东西 这是密码学意义上的有效的证书——它只是自我担保,而自担保正是信托店存在的拒绝内容.
Firefox这个名字特别: 一个私人或内部的CA 公众不运送。
一家公司经营自己的证书管理权(Active Directory Certification Services, a HashiCorp Vault PKI, a Internal.),并颁发证书.
在一个管理的公司的笔记本电脑上,那个CA的根被推入了信托店,所以一切都奏效了——看起来就像一个解决了的问题.
然后有人从一个没有管理的设备,个人电话,或者没有根的CI跑者中打出同一个主机,证书是因为那个客户端从来没有收到过内根.
证书没有改变;观众有改变.
TLS-检查代理或抗病毒重新签名流量.
企业中间箱(Zscaler,一款Palo Alto防火墙)和一些抗病毒产品终止了TLS,检查了它,并在去你途中与自己的CA重新签名.
如果那个CA的根被安装在机器上——对一个被管理的设备来说是正常的——它就是无形的.
如果不是(一个容器,一个VM,一个同事的BYOD手提电脑),每个HTTPS网站都突然显示,那就是:不是一个站点的证书被弄坏了,而是全部,因为路径中的东西是从一个不信任的根来重新发布所有的东西.
一条链通向错误的根,或者一个真正不信任的根.
链条结构上是完美的——中间物存在,主机名被覆盖,叶子上没有自签的活字——它仍然会从根起终止