我在使用临时凭证使用STS临时凭证启动与AWS IoT的连接时遇到问题,同时保持安全。AWS IoT MQTT通过使用STS临时凭证的Websocket
我已经成功地使用带有策略的证书连接嵌入式设备。 但是当我尝试通过浏览器尝试连接时,使用预先签名的URL,我遇到了一个绊脚石。
下面是一个Lambda函数的代码片断,它首先验证请求(未显示),然后使用STS凭证通过assumeRole构建URL。
使用我生成的URL和Paho JavaScript客户端,我已经成功地在浏览器中接收到“101交换协议”响应。但连接终止而不是切换到websockets。
任何帮助或指导任何人在那里都可以提供我会非常感激。
const iot = new AWS.Iot();
const sts = new AWS.STS({region: 'eu-west-1'});
const params = {
DurationSeconds: 3600,
ExternalId: displayId,
Policy: JSON.stringify(
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:*"
],
"Resource": [
"*"
]
},
/*{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:eu-west-1:ACCID:client/" + display._id
]
},
{
"Effect": "Allow",
"Action": [
"iot:Receive"
],
"Resource": [
"*"
]
}*/
]
}
),
RoleArn: "arn:aws:iam::ACCID:role/iot_websocket_url_role",
RoleSessionName: displayId + '-' + Date.now()
};
sts.assumeRole(params, function(err, stsData) {
if (err) {
fail(err, db);
return;
}
console.log(stsData);
const AWS_IOT_ENDPOINT_HOST = 'REDACTED.iot.eu-west-1.amazonaws.com';
var url = v4.createPresignedURL(
'GET',
AWS_IOT_ENDPOINT_HOST,
'/mqtt',
'iotdata',
crypto.createHash('sha256').update('', 'utf8').digest('hex'),
{
key: stsData.Credentials.AccessKeyId,
secret: stsData.Credentials.SecretAccessKey,
protocol: 'wss',
expires: 3600,
region: 'eu-west-1'
}
);
url += '&X-Amz-Security-Token=' + encodeURIComponent(stsData.Credentials.SessionToken);
console.log(url);
context.succeed({url: url});
});
编辑:如果有帮助,我只是检查在Chrome调试器的“框架”窗口中,选择它返回一个101码的请求后。它显示了一个单帧:“二进制帧(操作码2,掩码)”。
此操作代码是否指代MQTT控制代码2 AKA“CONNACK”?我不是MQTT的专家(还!)。