为什么 HTTPS 不支持不可否认性?

信息安全 tls 证书 不可否认性
2021-08-18 00:37:15

我最近偶然发现了一个我想到的特定项目。我认为 HTTPS 会证明给定内容实际上来自源,方法是在传输之前始终对其内容进行签名。但实际上,在最初的握手之后,所有通信都只能通过商定的对称加密密钥来保护。

这真的让我感到惊讶,因为不可否认性在沟通中非常重要,并且所有成分都可以在技术堆栈中使用以实现它。

为什么没有实施?纯粹是从性能的角度来看吗?还有其他动机吗?是否计划实施?

4个回答

我认为 HTTPS 会证明给定内容实际上来自源,方法是在传输之前始终对其内容进行签名。

由于“内容”是双向发送的,因此提供不可否认性将需要一些能够在通信双方签名的加密身份但 TLS 实际上只需要一些证明服务器是预期的服务器(以防止中间人攻击)。而且这个证明甚至不需要加密身份支持,但也可以有一些共享秘密(即PSK)支持。

虽然在大多数 TLS 情况下,服务器端使用证书,但客户端通常没有证书。这意味着不可否认性不能在两个方向上都起作用。需要一些客户端证书会使 TLS 的实际使用变得更加困难,因为不仅每个浏览器都需要像目前那样拥有自己的信任库,而且每个用户都需要拥有个人证书。

除此之外,用户是否真的希望他们发送的所有内容都具有不可否认性,这是值得怀疑的。这可能与寻求更多隐私和匿名性相反。像 PGP 或 S/MIME 这样的协议分别提供加密(包括完整性)和签名(不可否认性)是有原因的。

简而言之:不可否认性使协议和必要的基础设施更加复杂,在许多情况下甚至可能不需要。因此,TLS 坚持只保护通信,这对于大多数 TLS 用例来说已经足够了。如果确实需要或要求不可否认性(通常不是),则可以单独添加。

TLS 是一种两方通信协议,HTTPS 不比 HTTP over TLS 多多少。它的威胁模型只考虑两个参与者(客户端和服务器),其目标是保护通信免受可能读取或修改交换数据的攻击者的攻击。不可否认性根本不适合这种威胁模型:它是关于允许第三方验证通信的属性,而这从来都不是 TLS 或 HTTPS 的目标。

您声称“不可否认性在沟通中非常重要”是错误的。不可否认性是一种罕见的属性,通常并不重要,甚至是不希望的。可否认性(一方或双方否认发生特定数据交换的能力)通常是可取的和可实现的,它与不可否认性相矛盾。TLS 既不保证不可否认性也不保证可否认性,但两者都兼容。对于不可否认性,您至少需要让非否认方使用非对称签名方案签署要提交的数据。为了否认,您需要采取预防措施,防止可靠的第三方进行录音。(这些都不够!不可否认性和可否认性都是复杂的属性。)

此外,即使不可否认性很重要,它在通信中也不重要。它主要与通信的工作方式正交。不可否认性从根本上说是一种端到端的属性:一个或多个实体对某条数据进行承诺。TLS 是一种点对点的通信协议,HTTPS 通常涉及多个实体在服务器端生成内容。

即使是端到端的通信协议也很少能单独保证不可否认性。签名并不能保证不可否认性,因为它留下了签名方可以故意泄露其签名密钥的“核选项”。事实上,由于这个原因,不可能通过纯粹的加密手段(即不求助于受信任的第三方)来实现普遍的不可否认性。您最多可以设计一个协议,其中核选项会造成如此多的附带损害,以至于签名者不想使用它,这是只能在特定环境下做出的判断。

可以修改 TLS 协议,为每条消息添加一个非对称签名,这将使每一方都承诺发送这些消息,而不是调用核选项。但:

  • 在许多情况下,客户端未经过身份验证。所以只有服务器会提交任何东西,而不是客户端。
  • 根据 TLS 承载的协议,签名可能会或可能不会承诺任何有意义的事情。通常,交换的数据包括对双方都有意义的部分,但对可能有兴趣验证交换是否发生的第三方不包括在内。例如,它可能涉及对缓存数据的引用,或对服务器上数据的当前状态的引用,这些数据在事后无法验证(“删除第三行”)。
  • 根据 TLS 承载的协议,签名数据可能包含不得泄露的部分。由于 TLS 对它所携带的数据一无所知,因此它最多可以保证整个交换的真实性,或者它的某些前缀的真实性。因此,例如,如果通信以用户使用密码登录开始,则在不泄露用户密码的情况下,将无法验证后续数据。
  • 计算和验证每个数据包上的签名的成本会非常高。非对称加密比 MAC 贵很多。
  • 要交换的数据量会稍大一些。(如果涉及到后量子签名方案,则要大得多。)

如果您需要不可否认性:

  • 仔细检查您的威胁模型。确定哪一方可能想要对它发送的数据撒谎,以及它必须对哪一方负责。
  • 保护需要保护的数据。这几乎永远不会成为整个通信——例如,通常需要排除登录。通常,会进行一次或多次往返以确定数据,然后服务器将发送签名消息。
  • 用于不可否认数据的签名密钥可能与用于通信的签名密钥不同(前者属于后端,后者属于前端)。

除其他原因外,我不准备在协议级别说没有办法对 CGI 服务器说“回显此内容”。如果您没有不可否认性,那么出于安全原因,这不是问题;但是,如果您在协议级别拥有它,那么这就是安全漏洞。

如果我想要不可否认性,我将使用签名内容文件格式,而不是签名交付协议。X509 可以签署很多东西,包括 zip 文件。

不可否认性是一种合法财产,因此不能被 TLS 等协议“支持”。如果发生最终必须在法庭上解决的争议,该财产很有趣,并且只有在考虑到整个环境并且可以证明对环境的信任是有保证的情况下才能对其进行评估。

例如,如果我们谈论的是 GPG 中的不可否认性,那么当我命令我的公司(我没有公司)在附近的河流中倾倒有毒化学品时,我可能要承担责任。如果我如此堕落以至于签署那封电子邮件,那么可能会说真的是我发送了那封电子邮件。为了反驳这一点,我可能会向法庭证明我通过私人签名密钥保护的安全性不是那么好,并且其他人能够发送这封电子邮件并将其从已发送文件夹中删除。

回到 TLS。假设服务提供商利用 TLS 卸载并将所有未加密的流量简单地存储到某个存储介质中,只有极少数受信任的人可以访问并且与相关人员没有任何关系。这是关于谁在何时何地交流了什么的记录。可以在法庭上辩称这是准确的。