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

时间:2019-10-28 14:44:05

标签: http security https cryptography tls1.2

我已经创建了一个API端点,我有一个该端点的用户向stackoverflow.com处的服务器请求。我想验证请求是否来自stackoverflow.com服务器。我可以验证它来自stackoverflow.com的一种方法是,要求开发人员使用他们的加密域私钥来签署请求。然后,我可以使用他们的公钥来解密邮件。

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

2 个答案:

答案 0 :(得分:3)

TLS supports client authentication,也称为“ 2向”或“相互”身份验证。 (SSL3也可以,但您不应该使用SSL3。)参见例如TLS1.2 ECCTLS1.3的“已更新”。

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

一些可能无关紧要的细节:

  • 这不签署请求。它对TLS 连接进行身份验证(准确地说,通常是对握手记录进行签名),然后使用创建(并因此进行身份验证)的密钥对通过连接传输的数据进行MAC(以及加密)通过握手。这样可以提供身份验证,但不能否认数据。接收者可以 you 可靠地确定它来自发送者,但是您不能可靠地向第三方证明这一点。有关“证明” 服务器的密切相关案例,请参见链接在https://security.stackexchange.com/questions/205074/is-it-possible-to-save-a-verifiable-log-of-a-tls-session上的众多交叉项。

  • 这将对所标识的客户端发送的数据进行身份验证;正如Sam Jason所指出的,起源往往没有什么不同。

  • 客户端不一定由域名标识;它可以是一个人,一个组织或其他东西。但是,很多 CA分别为TLS服务器身份验证 和客户端身份验证颁发了一个证书(请查看您自己的ExtendedKeyUsage扩展或任何示例证书中的内容),并且在这种情况下,几乎没有例外,可以通过域名或域名或至少通配符来标识主题。

答案 1 :(得分:1)

我很确定您应该使用某种API密钥,或者可能使用类似于twilio对其请求进行签名的方式

产生这些模式的原因之一是HTTP请求被代理,而静态请求则由代码/应用程序服务器以外的其他设备处理。因此TLS连接将在代理服务器上终止,并且实际的应用程序代码将无法轻松看到有关远程服务器使用的TLS连接的任何信息