AWS IoT-通过.Net、REST和证书访问影子



为了学习AWS IoT,我创建了一些"Things"+一个策略,我甚至能够使用IoT CLI来列出事物列出策略。我甚至可以通过CLI使用updatething命令来更新影子。但是,一旦我尝试通过RESTGET/POST请求访问Shadow(通过.Net程序或直接类似https://XXXXXXXXXXXXX.iot.us-west-2.amazonaws.com/things/mything/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-请求ID:25f3c1dc-9ddd-4787-a4cf-cb79dc96748b
连接:保持活动
x-amzn-错误类型:禁止异常:
日期:2015年12月15日星期二08:53:56 GMT
内容长度:91
内容类型:application/json
}

有什么帮助吗?

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

  1. 对API端点的HTTPS调用
  2. 使用您选择的任何受支持的AWS SDK(python、java、.NET等)或AWS CLI

对于"缺少身份验证令牌"的异常,您得到的原因是请求中的身份验证令牌和特定于amazon的标头不可用。为了使HTTPS请求正常工作,您可以使用rest客户端添加特定于amazon的标头,也可以编写程序。

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

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

任务1:创建规范请求

  • 步骤1是定义动词(GET、POST等)
  • 步骤2:创建规范URI
  • 步骤3:创建规范查询字符串
  • 步骤4:创建规范的头和签名的头
  • 第5步:创建已签名标头的列表
  • 步骤6:创建有效负载哈希(请求正文内容的哈希)
  • 步骤7:组合元素以创建规范化请求

任务2:创建要签名的字符串使用SHA256算法,对规范请求进行散列(使用任何编程语言/工具),并创建一个字符串以在下面签名

string_to_sign=YourHashingAlgorithm+'\n'+CurrentDateInUTC+'\n'+credential_scope+'\n'+yourHashedCanonical请求

API到AWS服务由服务路径唯一标识。对于物联网,它是"iotdata/aws4_request"。因此,您在上面的"string_to_sign"中的凭证范围应该像一样

credential_scope=日期戳+'/'+us-west-2+'/'+iotdata+'/`+"aws4_request"

任务3:计算签名

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

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

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

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

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

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

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

在cURL中,它将类似于下面的内容

卷曲"https://iot.amazonaws.com"\--请求GET\--form"Action=UpdateThing"\--form"UserName=iam_user"\--form"CertificateBody=@~/.aws/credentials/sample/cert.pem"\--表单"版本=2010-05-08"\--表单"AUTHPARAMS"

希望这能帮助

最新更新