【问题标题】:InvalidSignatureException with AWS Kinesis Video Stream C#InvalidSignatureException 与 AWS Kinesis Video Stream C#
【发布时间】:2020-02-04 04:32:27
【问题描述】:

我正在尝试执行我自己的 HTTP 签名请求,因为 C# 中没有用于 AWS Kinesis Video Stream 的 PutMedia API 的开发工具包,但我收到以下错误消息:

状态码:403,原因短语:“禁止” x-amzn-ErrorType: InvalidSignatureException:http://internal.amazon.com/coral/com.amazon.coral.service/

以下是我的代码的要点:

            var streamName = "audio-stream-test";
            var service = "kinesisvideo";
            var endpoint = GetPutMediaEndpoint(streamName);
            var host = GetHostFromEndpoint(endpoint);
            var region = GetRegionFromEndpoint(endpoint);

            var t = DateTime.UtcNow;
            var canonical_uri = $"{endpoint}/putMedia";

            var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(canonical_uri));
            httpRequestMessage.Headers.Add("connection", "keep-alive");
            httpRequestMessage.Headers.Add("host", host);
            httpRequestMessage.Headers.Add("Transfer-Encoding", "chunked");
            httpRequestMessage.Headers.Add("user-agent", "AWS-SDK-KVS/2.0.2");
            httpRequestMessage.Headers.Add("x-amzn-fragment-acknowledgment-required", "1");
            httpRequestMessage.Headers.Add("x-amzn-fragment-timecode-type", "ABSOLUTE");
            httpRequestMessage.Headers.Add("x-amzn-producer-start-timestamp", (t - DateTime.MinValue).TotalMilliseconds.ToString());
            httpRequestMessage.Headers.Add("x-amzn-stream-name", streamName);
            httpRequestMessage.Headers.Add("x-amz-security-token", sessionToken);

            var byteArray = File.ReadAllBytes(filePath);
            var content = new ByteArrayContent(byteArray);
            httpRequestMessage.Content = content;

            var httpClient = new HttpClient();

            var aws4RequestSigner = new AWS4RequestSigner(accessKey, secretAccessKey);
            var signedHttpRequestMessage = aws4RequestSigner.Sign(httpRequestMessage, service, region).Result;
            var httpResponseMessage = httpClient.SendAsync(signedHttpRequestMessage);

Screenshot of Error

我正在使用 Aws4RequestSigner NuGet 包对请求进行签名。有什么想法我在这里做错了吗?有没有人尝试过将 AWS Kinesis Video Stream 与 C#/.NET 一起使用成功?

【问题讨论】:

    标签: c# amazon-web-services amazon-kinesis


    【解决方案1】:

    伪代码的两个潜在问题。

    1. 如果使用会话令牌,则请求签名应包括会话令牌,而不仅仅是访问密钥/秘密访问密钥组合。
    2. PutMedia 的主体是“无尽的”,因为它作为实时流流出。因此,数据不应包含在签名计算中。

    【讨论】:

    • 感谢您的反馈。我已更改代码以将会话令牌包含为签名的一部分,并且还从签名计算中删除了数据。不幸的是,仍然收到 403 禁止的无效签名异常。
    • @mv18742n 您能否尝试删除以下标头:'httpRequestMessage.Headers.Add("host", host); '。 C Producer SDK 代码在此处:github.com/awslabs/…,其功能与您的代码类似。
    • 好吧,我终于得到了 200(OK)。我有两个错误:1-连接标头不是签名的一部分。 2 - 正如@N'Bayramberdiyev 所说,PutMedia 是“无穷无尽的”,不应该被签名,事实上它应该被添加为“UNSIGNED-PAYLOAD”。我现在的问题是实际的“内容”没有被添加到流中。我看到了来自 KVS 的放置连接,但没有添加任何数据。有任何想法吗?感谢您迄今为止的所有帮助。
    【解决方案2】:

    这是对您的问题“实际的“内容”没有被添加到流中的答案。我看到了来自 KVS 的放置连接,但没有添加数据”。

    通过使用以下代码为签名正确设置 http 标头获得 200 后,您需要在 signedHttpRequestMessage 中设置您的内容。

    var httpResponseMessage = httpClient.SendAsync(signedHttpRequestMessage);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 2019-04-19
      相关资源
      最近更新 更多