AWS物联网-通过.Net、REST和证书访问影子

AWS物联网-通过.Net、REST和证书访问影子,rest,authentication,amazon-web-services,iot,Rest,Authentication,Amazon Web Services,Iot,为了学习AWS IoT,我创建了一些“东西”+策略,我甚至能够使用IoT CLI来列出东西或列出策略。我甚至可以通过CLI使用update thing命令通过CLI更新阴影。但一旦我尝试通过REST GET/POST请求(通过.Net程序或直接类似程序)访问阴影,我就会收到 “缺少身份验证令牌” 。所以我开始使用证书。以下是我的部分代码: string Certificate = "xxxxxxxxx-certificate.crt"; // downloaded from my thing X

为了学习AWS IoT,我创建了一些“东西”+策略,我甚至能够使用IoT CLI来列出东西列出策略。我甚至可以通过CLI使用update thing命令通过CLI更新阴影。但一旦我尝试通过REST GET/POST请求(通过.Net程序或直接类似程序)访问阴影,我就会收到

“缺少身份验证令牌”

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

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;
string Certificate=“xxxxxxxxx-Certificate.crt”//从我的东西上下载
X509Certificate cert=新的X509Certificate(证书);
WebRequestHandler=新的WebRequestHandler();
handler.ClientCertificates.Add(cert);
HttpClient=新的HttpClient(处理程序);
//url=@“https://xxxxxxxxxxxxx.iot.us-west-2.amazonaws.com/things//shadow";
HttpResponseMessageWebResponse=client.GetAsync(url,HttpCompletionOption.ResponseContentRead).Result;
结果是:

状态代码:403,原因短语:“禁止”,版本:1.1,内容:System.Net.Http.StreamContent,标题:
{
x-amzn-RequestId:25f3c1dc-9ddd-4787-a4cf-cb79dc96748b
连接:保持活动状态
x-amzn-ErrorType:禁止异常:
日期:2015年12月15日星期二08:53:56 GMT
内容长度:91
内容类型:应用程序/json
}


有什么帮助吗?

如果您想发布和/或订阅主题,可以采取两种不同的方法

  • 对API端点的HTTPS调用
  • 使用您选择的任何受支持的AWS SDK(python、java、.NET等)或AWS CLI
  • 因为“缺少身份验证令牌”异常是由于请求中的身份验证令牌和特定于amazon的头不可用。要使您的HTTPS请求工作,您可以使用rest客户端添加特定于amazon的头或编写程序

    您应该尝试执行以下步骤以使https请求正常工作

    有关详细步骤,请参阅

    任务1:创建规范化请求

    • 第一步是定义动词(GET、POST等)
    • 步骤2:创建规范URI
    • 步骤3:创建规范查询字符串
    • 步骤4:创建规范头和签名头
    • 步骤5:创建已签名标题的列表
    • 步骤6:创建有效负载哈希(请求正文内容的哈希)
    • 步骤7:组合元素以创建规范请求
    任务2:创建要签名的字符串 使用SHA256算法,散列规范请求(使用任何编程语言/工具),并创建一个字符串进行签名,如下所示

    字符串\u to \u sign=YourHashingAlgorithm+'\n'+CurrentDateInUTC+'\n' +凭证\u作用域+'\n'+yourHashedCanonicalRequest

    AWS服务的API由服务路径唯一标识。对于物联网,它是“物联网数据/aws4\U请求”。因此,上述“字符串到符号”中的凭证范围应如下所示

    凭证范围=日期戳+'/'+us-west-2+'/'+iotdata+'/'+ “aws4_请求”

    任务3:计算签名

    使用前面步骤中使用的相同算法计算哈希

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

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

    在这里,您需要设置一些标题,如“x-amz-date”、“Authorization”、“SignedHeaders”和“Signature”。此签名标题将携带步骤3的最终值

    注意:这些标题都不是可选的。每个HTTPS请求都应该包含所有这些信息,以便进行身份验证和授权。否则AWS API将拒绝它

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

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

    在旋度中,它将是如下所示

    卷曲“\ --请求获取\ --表单“Action=UpdateThing”\ --表格“用户名=iam\U用户”\ --表格“CertificateBody=@~/.aws/credentials/sample/cert.pem”\ --表格“版本=2010-05-08”\ --格式“AUTHPARAMS”

    希望这有帮助