首页 文章

AWS IoT - 通过.Net,REST 和证书访问阴影

提问于
浏览
5

尝试学习 AWS IoT,我创建了一些“事物”策略,我甚至可以使用 IoT CLI 来list-thingslist-policies。我甚至可以通过 CLI 使用update-thing命令通过 CLI 更新阴影。但是一旦我尝试通过 REST GET/POST 请求(通过.Net 程序或直接像https://XXXXXXXXXXXXX.iot.us-west-2.amazonaws.com/things/mything/shadow)访问 Shadow,我收到一个

“缺少身份验证令牌”

。所以我开始使用证书。这是我的代码的一部分:

string Certificate = "xxxxxxxxx-certificate.crt"; // downloaded from my thing
X509Certificate cert = new X509Certificate(Certificate);
WebRequestHandler handler = new WebRequestHandler();
handler.ClientCertificates.Add(cert);
HttpClient client = new HttpClient(handler);
// url = @"https://xxxxxxxxxxxxx.iot.us-west-2.amazonaws.com/things/<mything>/shadow";
HttpResponseMessage webResponse = client.GetAsync(url, HttpCompletionOption.ResponseContentRead).Result;

结果是:

StatusCode:403,ReasonPhrase:'Forbidden',版本:1.1,内容:System.Net.Http.StreamContent,标题:
{
x-amzn-RequestId:25f3c1dc-9ddd-4787-a4cf-cb79dc96748b
连接:Keep-Alive
x-amzn-ErrorType:ForbiddenException:
日期:2015 年 12 月 15 日星期二 08:53:56 GMT
Content-Length:91
Content-Type:application/json
}

任何帮助?

1 回答

  • 2

    如果要发布 and/or 订阅主题,可以采用两种不同的方法。

    • HTTPS 调用 API 端点。

    • 使用您选择的任何受支持的 AWS 开发工具包(python,java,.NET 等)或 AWS CLI

    对于“遗失的身份验证令牌”异常,您获得的原因是请求中的身份验证令牌和亚马逊特定标头不可用。要使您的 HTTPS 请求正常工作,您可以使用 rest 客户端添加 amazon 特定标头或编写程序。

    您应该尝试执行以下步骤以使您的 https 请求生效。

    有关详细步骤,请参阅http://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html

    任务 1:创建一个典型的请求

    • 第 1 步是定义动词(GET,POST,etc.)

    • 第 2 步:创建规范 URI。

    • 第 3 步:创建规范查询字符串。

    • 第 4 步:创建规范标头和签名标头。

    • 第 5 步:创建签名标头列表。

    • 步骤 6:创建有效负载散列(请求正文内容的散列)

    • 第 7 步:组合元素以创建创建规范请求

    任务 2:创建标记字符串使用 SHA256 算法,散列规范请求(使用任何编程 language/tools)并创建一个字符串以便如下所示进行签名

    string_to_sign = YourHashingAlgorithm' n'CurrentDateInUTC' n'credential_scope' n'yourHashedCanonicalRequest

    AWS 服务的 API 由服务路径唯一标识。对于物联网,它是**“iotdata/aws4_request”**。所以上面'string_to_sign'中的 credential_scope 应该是这样

    credential_scope = datestamp'/'us-west-2'/'iotdata'/''aws4_request'

    任务 3:计算签名

    使用先前步骤中使用的相同算法计算哈希值。

    有关更多详细信息,请参阅上述链接。

    任务 4:在请求中添加签名信息

    在这里,你需要设置一些标题,如'x-amz-date','授权','签名的标题'和'签名'。此 Signature 标头将携带步骤 3 的最终值。

    **注意:**这些标题都不是可选的。每个 HTTPS 请求都应具有用于身份验证和授权的所有信息。否则 AWS API 将拒绝它。

    您应该得到 200 OK 响应,以确保您的请求得到实际处理。

    来到您的.Net 方法,您可以尝试使用 AWS 的.NET SDK 并尝试检查最终请求。我从未尝试过直接在代码中使用 x.509 证书。我认为您的请求中缺少标题。

    在 cURL 中,它将类似于下面

    curl“https://iot.amazonaws.com”\

    希望这可以帮助

相关问题