是否可以使用 TLS 验证 http 请求的发件人来源

Is it possible to verify the sender origin of an http request using TLS

我已经创建了一个 API 端点,我有一个端点的用户从位于 whosebug.com 的服务器请求。我想验证请求是从 whosebug.com 个服务器发出的。我可以验证它来自 whosebug.com 的一种方法是要求开发人员使用他们的 let's encrypt 域私钥签署请求。然后我可以使用他们的 public 密钥来解密消息。

我不确定我是否可以使用他们的 public 密钥解密私人加密的消息,但即使可以,我也希望避免让开发人员进行任何特殊类型的加密。我可以使用 TLS 来验证源域吗?

我很确定您应该使用某种 API 密钥或类似于 twilio 签署其请求的方式

这些模式的一个原因是代理 HTTP 请求很常见,静态请求由 code/application 服务器以外的其他东西处理。因此 TLS 连接会在代理服务器处终止,实际的应用程序代码将无法轻易看到远程服务器使用的 TLS 连接的任何信息

TLS supports client authentication, also called '2-way' or 'mutual' authentication. (SSL3 also did, but you should not be using SSL3.) See e.g. TLS1.2 'updated' 对于 ECC and TLS1.3

如何使用它取决于用于 TLS 的软件(通常是库或中间件),您没有说明;甚至有可能某些 TLS 堆栈根本不支持它,尽管我从未听说过。 一些 堆栈或用例允许在不更改任何代码的情况下调用客户端身份验证,而其他堆栈或用例仅需最少或本地化的代码更改。

一些可能重要也可能不重要的细节:

  • 这不会签署请求。它验证 TLS connection(确切地说,它通常签署握手的副本),然后使用创建的密钥(和从而通过握手验证)。这为数据提供了身份验证但不是不可否认性; 接收方可以可靠地确定它来自发送方,但你无法向第三方可靠地证明这一点。对于 'proving' 与 服务器 密切相关的案例,请参阅 https://security.stackexchange.com/questions/205074/is-it-possible-to-save-a-verifiable-log-of-a-tls-session 处链接的众多 crossdupes。

  • 这验证数据是由已识别的客户端发送;它没有提到 origin,正如 Sam Jason 指出的那样,它通常是不同的。

  • 客户端不一定是用域名标识的;它可以是个人、组织或其他事物。但是,许多 CA 为 TLS 服务器身份验证 客户端身份验证颁发单个证书(查看您自己的 ExtendedKeyUsage 扩展名或任何示例证书( s) 看到),在这种情况下,除了少数例外,主题由域名或名称或至少通配符标识。