为什么不通过DNS记录而不是letencrypt验证自签名证书


16

我只是想知道。我们使用许多SSL证书。如今,我们几乎只使用letencrypt(谢谢!)。这些证书的底线是,证书上域名的所有权证明来自操纵这些域下的DNS记录或网站的权力。DNS证明来自将一些密钥(由letencrypt提供)作为TXT记录添加到DNS。

因此,如果有足够的证据可以更改域的DNS记录,那么为什么不在DNS中使用带有指纹的自签名证书呢?

我要说的是,此信任与letencrypt(和其他CA)基于DNS的过程完全相同:

  1. 创建一个自签名的CA(只需遵循各种操作步骤即可)
  2. 为某些域创建证书
  3. 使用来自步骤1的CA对来自步骤2的证书进行签名。现在,您具有由不受信任的CA签名的基本证书。
  4. 将TXT(或专用)记录添加到每个域的DNS中,说明:我们已使用此CA签署了该域的证书。像:“ CA = -CA的指尖”
  5. 浏览器下载证书并通过比较CA的指纹/ CA证书与给定域的DNS中的数据进行验证。

这样就可以创建不受第三方干扰的,与任何基本SSL证书具有相同信任级别的受信任的自签名证书。只要您有权访问DNS,您的证书就有效。甚至可以添加一些DNSSEC(如加密),以从CA加上SOA记录中进行哈希处理,以确保信任因DNS记录的更改而消失。

以前考虑过吗?

耶尔默



谢谢哈坎!通过更新,我找到了该RFC的术语DANE。RFC的最新版本:tools.ietf.org/html/rfc7671 另请参见:en.wikipedia.org/wiki/…(我将在以后阅读)。
Jelmer Jellema,

2
RFCHåkan链接中还涵盖了“为什么不”:如果没有DNSSEC,由于DNS固有的漏洞,整个模型的可靠性将受到损害。还应注意,DNSSEC不会保护客户端和递归系统之间的流量,这在中间欺骗中仍然容易受到人的攻击。
安德鲁B

安德鲁,我看到了DNSSEC和MIDM的问题,当没有为域强制使用DNSSEC时,只有在通过查找根域服务器的tld来完成每次查找的情况下,才可以执行强制。因此,问题是:我们想通过所有者声明其合法性来授权使用某些DV证书,但由于其层次结构,我们无法信任DNS。DNS容易受到欺骗和MIDM攻击的事实使得DV证书有点像域条目的外部验证。嗯,我会继续思考……
Jelmer Jellema

Answers:


18

存在使之成为可能的基本基础结构,该基础结构称为RFC6698中指定的基于DNS的命名实体身份验证(DANE)。它通过TLSA资源记录来工作,该资源记录指定了终端实体或其链中的CA之一的证书或公钥(实际上有四种类型,有关详细信息,请参阅RFC)。

采用

但是,DANE尚未得到广泛采用。威瑞信(VeriSign)监控DNSSEC和DANE的采用情况,跟踪其随着时间的增长

6月17日之间的全球TLSA部署

为了进行比较,根据VeriSign的说法,大约有270万个DNS区域,这意味着所有区域中超过1%的区域至少具有一个TLSA记录。

我不能给出任何权威性的答案,为什么选择DANE,但这是我的推测:

DANE与证书吊销列表(CRL)和在线证书状态协议(OCSP)遭受相同的问题。为了验证所提交证书的有效性,必须联系第三方。HannoBöck 给出了很好的概述,为什么这实际上是一个大问题。归结为当您无法联系第三方时该怎么办的问题。在这种情况下,浏览器供应商选择了软失败(又名许可),这使整个事情变得毫无意义,Chrome最终决定在2012年禁用OCSP。

域名系统

可以说,DNS比CA的CRL和OCSP服务器提供了更好的可用性,但是仍然使脱机验证变得不可能。此外,DANE仅应与DNSSEC结合使用。由于正常的DNS在未经身份验证的UDP上运行,因此很容易出现伪造,MITM攻击等。采用DNSSEC比采用DANE更好,但仍远远没有普及。

借助DNSSEC,我们再次遇到了软故障问题。据我所知,默认情况下,没有主要的服务器/客户端操作系统提供可验证的DNSSEC解析器。

然后还有撤销的问题。DNSSEC没有撤消机制,而是依靠短寿命密钥。

软件支援

所有参与的软件都必须实现DANE支持。

从理论上讲,您可能会认为这将是加密库的工作,而应用程序开发人员将不必做很多事情,但事实是,加密库通常仅提供原语,而应用程序必须自己进行大量配置和设置(不幸的是,有很多方法可以解决问题)。

我不知道,例如,任何主要的Web服务器(例如Apache或Nginx)都已实现DANE或已计划这样做。Web服务器在这里尤为重要,因为越来越多的东西是基于Web技术构建的,因此它们通常是第一个实现的东西。

当我们将CRL,OCSP和OCSP装订进行比较时,我们也许可以推断出DANE采用的故事将如何发展。仅某些使用OpenSSL,libnss,GnuTLS等的应用程序支持这些功能。诸如Apache或nginx之类的主要软件花了一段时间才支持它,并再次参考HannoBöck的文章,他们弄错了,并且其实现存在缺陷。其他主要软件项目(如Postfix或Dovecot)不支持OCSP并且具有非常有限的CRL功能,基本上指向文件系统中的文件(不一定要定期重新读取,因此您必须手动重新加载服务器等)。请记住,这些是经常使用TLS的项目。然后,您可以开始研究TLS不太常见的情况,例如PostgreSQL / MySQL,也许它们最多提供CRL。

因此,我什至没有现代的Web服务器来实现它,大多数其他软件甚至都没有实现OCSP和CRL,这对于您5年的企业应用程序或设备来说是好运。

潜在的应用

那么,您实际上可以在哪里使用DANE?截至目前,还没有在普通的Internet上。如果您控制服务器和客户端,也许是一种选择,但是在这种情况下,您通常可以诉诸公钥固定。

在邮件领域,DANE受到了一定的欢迎,因为SMTP最长没有任何形式的经过身份验证的传输加密。SMTP服务器有时确实在彼此之间使用TLS,但没有验证证书中的名称是否实际匹配,它们现在开始通过DANE进行检查。


6
我想你的最后一句话被删掉了。
8bittree'3

谢谢塞巴斯蒂安,您的反应非常有帮助。请在OP下查看我和Andrew的评论。
Jelmer Jellema

3
为什么Web服务器必须实现这一点?我可以将自签名证书添加到apache配置中,然后自己将指纹放在DNS中,对吗?
Jelmer Jellema,

1
DNSSEC与DNS相比,还存在性能和可伸缩性问题:普通DNS可以使用“固定”响应,但是DNSSEC必须对每个请求进行加密,并且有很多DNS请求在四处游荡。就像很多 DNS请求一样。
Joker_vD

4
@Joker_vD DNSSEC对数据进行签名,而不对流量进行签名。即,在权威的一端,您可以对区域签名,并且在签名的生命周期内(或者直到您更改区域数据为止)没有更多的“加密”。在未验证的请求“加密”中需要发生在验证方(客户端)。附加数据和DNSSEC状态都适合DNS的常规缓存模型。
哈坎·林奎斯特

5

不同类型的证书验证程序

使用常规的CA签名的证书,有多个级别的证书验证:

  • 域验证(DV)
    仅验证域名所有权,证书中仅将域名显示为“主题”
  • 组织验证(OV)
    域名和所有者名称经过验证,域名和所有者名称在证书中显示为“主题”
  • 扩展验证(EV)
    对所有者实体,域名和所有者名称的更严格的验证在证书中显示为“主题”,带有所有者名称的绿色栏

您描述并建议替代的过程仅适用于最低级别的域验证(DV)。

DV是验证相对容易实现自动化的级别,例如LetsEncrypt所做的工作,并且提供与DNS所提供的信任级别相似的信任级别,如果DNS被用作信任锚的唯一来源(UI含义,证书可能被信任,但包含未经验证的其他数据)。

基于DNS的命名实体(DANE)身份验证

DANE建立在DNSSEC之上(因为DNS数据的真实性至关重要),可以为DNS中的TLS客户端发布信任锚信息。

它使用TLSARR类型,可用于标识最终实体或CA 的证书或公钥(选择器),无论是否需要成功进行常规证书链验证(证书使用)以及证书的方式, / key数据在记录中表示(匹配类型)。

TLSA记录拥有者名称具有前缀指示的端口和协议(例如,_443._tcp)和RDATA指示cert usageselector并且matching type除了证书模式/键数据相匹配。有关这些参数的详细信息,请参见RFC6698的2.1节

TLSA例如,一条记录可以如下所示:

_443._tcp.www.example.com. IN TLSA  2 0 1 d2abde240d7cd3ee6b4b28c54df034b9 7983a1d16e8a410e4561cb106618e971

通过使用模式23(表示仅使用TLSA信任锚),支持DANE的客户端将接受未由一般信任的CA签名但与TLSA记录匹配的证书。
从概念上讲,这与您在问题中提出的内容相同。

抓住?目前,DANE感知客户端几乎不存在,一个问题是DNSSEC本身没有像DANE起飞所需要的那样广泛部署(尤其是在客户端计算机上进行验证)。考虑到DANE是依赖身份验证的DNS数据的第一个潜在的大型新用例之一,这可能有点麻烦。

有一个浏览器插件添加了DNSSEC和DANE验证,除了目前还没有什么主流的插件。而且,作为一个插件而不是本机支持,它在一般用途上比其他任何东西更多地用作概念验证。


可以做到的。已经考虑了。它仍然可能发生,但是并没有太多动静。


谢谢Håkan。正如安德鲁(Andrew)在我的操作说明中指出的那样,DNS和DNSSEC存在问题,因为没有强制使用DNSSEC(我猜想即使在TLD DNS上的密钥就位也没有),DNS服务器可能会欺骗DANE信息。 , 对?因此,DNSSEC应该有义务使DANE记录有效,这反过来意味着每次检查都必须检查TLD服务器上的密钥。
Jelmer Jellema

5
@JelmerJellema正如我在回答中指出的那样,DNSSEC需要在客户端上进行验证(这不是Andrew指出的问题),并且只能使用经过成功验证的签名TLSA记录。您提到的这个问题在设计上不是问题,在主流软件的支持方面是一个问题。
哈坎·林奎斯特

2
尽管并不完美,但ISP或开放式域名服务提供商(例如8.8.8.8或9.9.9.9)中越来越多的递归名称服务器正在进行DNSSEC验证。基于未绑定和/或类似stubby之类的dnssec触发将允许在客户端上具有完整的DNSSEC验证,而不必在客户端上具有完整的验证DNS解析器。但是我们确实离那很远……
帕特里克·梅夫策克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.