当前位置: 首页 > 知识库问答 >
问题:

在Lambda中验证AWS SIGv4签名

贺正祥
2023-03-14

我们有一个无服务器后端,它由API网关中的IAM保护。我们有另一个内部身份验证解决方案,我们希望在我们的服务中支持这两种身份验证机制。我计划编写一个自定义授权程序,带有支持多重身份验证的身份验证链。

但是,我找不到任何方法在后端验证AWS Sigv4签名。我发现AWS文档关于如何签署请求或计算Sigv4签名([1],[2],[3]和[4]),但是所有这些文档都是从客户端的角度来看的,客户端将可以访问ACCESS_KEY_ID,SECRET_ACCESS_KEY和SESSION_TOKEN。当自定义授权程序lambda将收到请求时,它将只有ACCESS_KEY_ID(在授权标头中)和SESSION_TOKEN(作为附加标头)。因此,无法在后端重新计算签名。如何验证后端的签名以进行身份验证?

这篇文章可能是关于如何验证AWS SigV4签名的重复文章,但仍然没有得到回答。此问题中建议的解决方案仍然需要密钥。

[1] https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html
[2]https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-examples-using-sdks.html
[3]https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html
[4]https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html

共有1个答案

甄坚白
2023-03-14

(注意:我在这里说得有点多,我自己也没有试图实现这一点,只是偏离了第一原则。)

我的理解是SigV4是对称密码,因为它使用的是对称的HMAC。这意味着您的lambda(不可信的第三方)没有密钥本身(在本例中是“秘密访问密钥”)就无法验证签名。如果你有钥匙,你就可以冒充那个用户。可能不受欢迎: P

对于会话令牌,您必须将会话令牌包括在请求头中,正如您所提到的(可能是因为没有人知道您使用哪个会话令牌进行了签名;没有相应的AWS\u session\u token\u ID)。这意味着您实际上可以验证签名,但只能验证请求的完整性:您不知道该会话令牌是否确实属于相关用户

所以我认为除非AWS为你证实,否则你是被束缚住了。

 类似资料:
  • 我们的旧系统使用.NET 3.5(运行在Windows Server 2003 32bits上)来验证来自我们客户的电子收据(都使用SHA1RSA算法作为协议)。我们将他们的证书以Base64字符串存储在数据库中。旧代码如下所示: 除了性能不好外,没有其他问题。这就是为什么我们想要转移到使用Java1.7的新系统(运行在Windows Server 2012 64位上)。我们的新代码如下所示: 我

  • 情况是我必须检查一个数字签名: 字符串1“A1005056807CE11EE2B4CE0025305725CFRCN=KED,OU=I0020266601,OU=SAPWebAS,O=SAPTrustCommunity,C=DE20130611102236”通过PKCS#7签名并通过HTTP-URL发送给我。 我在BASE64中获得签名的内容(在代码字符串sc中查找)。 现在我必须检查,如果Str

  • 问题内容: 我正在尝试以编程方式验证jar文件是否未被明显篡改。我有2个要防止的用例。1)修改现有类2)在罐子中添加新类 我使用jarsigner签名了罐子。当我用jarsigner验证以上两种情况之一时,它的工作方式就与我期望的一样。 当我尝试使用如何以编程方式验证用jarsigner签名的jar 或如何通过自签名的jar验证签名中的示例以编程方式进行操作时 ?但是,我没有任何SecurityE

  • 我有一个这样的处理程序和一个自定义注释@validrequest: 注释本身看起来是这样的: 而验证器是这样的: 问题是验证被完全忽略了。我可以发送任何事件有或没有身体和一切工作无一例外。我做的一切都是根据Micronout文档,会有什么问题吗? https://docs.micronaut.io/latest/guide/index.html#BeanValidation

  • 问题内容: 我有一个字符串,一个签名和一个公共密钥,我想验证字符串上的签名。密钥如下所示: 我已经阅读了一段时间的pycrypto文档,但是我不知道如何使用这种密钥制作RSAobj。如果您了解PHP,我将尝试执行以下操作: 另外,如果我对任何术语感到困惑,请告诉我。 问题答案: 标记之间的数据是包含PKCS#1 RSAPublicKey的PKCS#8 PublicKeyInfo的ASN.1 DER

  • 我有一个使用C++中的openSSL生成的keypair,我正在使用它在一个严格使用RSACryptoServiceProvider(没有BouncyCastle等)的C#服务器上对验证消息进行签名。我使用PKCS#1 SHA256生成签名,然后以十六进制的形式与公钥一起传输签名。问题是无法在服务器上验证签名。我已经尝试删除了头,上面写着“----开始RSA公钥-----”等等。但是还没有结果。生