带有 STS 临时凭证的 Websocket 上的 AWS IoT MQTT
AWS IoT MQTT over Websocket with STS temporary credentials
我在使用临时凭证启动与使用 STS 临时凭证的 AWS IoT 的连接时遇到问题,同时又要保证安全。
我已经使用带有策略的证书成功连接了嵌入式设备。
但是当我尝试使用预签名 URL 通过浏览器连接时,我遇到了绊脚石。
下面是来自 Lambda 函数的代码片段,它首先对请求进行身份验证(未显示),然后通过 assumeRole 使用 STS 凭据构建 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 调试器中检查了 "Frames" window,在选择 returns 101 代码的请求之后。它显示单帧:"Binary Frame (Opcode 2, mask)".
此操作码是否引用 MQTT 控制代码 2 AKA "CONNACK"?我不是 MQTT 专家(还不是!)。
我通过阅读STS 上的文档意识到我的错误。
If you pass a policy to this operation, the temporary security credentials that are returned by the operation have the permissions that are allowed by both the access policy of the role that is being assumed, and the policy that you pass.
提供的 RoleARN 还必须允许您通过 STS assumeRole 请求的操作。
即RoleARN 可以允许 iot:*,然后当您担任角色时,您可以将权限缩小到例如 iot:Connect 和特定资源。
我在使用临时凭证启动与使用 STS 临时凭证的 AWS IoT 的连接时遇到问题,同时又要保证安全。
我已经使用带有策略的证书成功连接了嵌入式设备。 但是当我尝试使用预签名 URL 通过浏览器连接时,我遇到了绊脚石。
下面是来自 Lambda 函数的代码片段,它首先对请求进行身份验证(未显示),然后通过 assumeRole 使用 STS 凭据构建 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 调试器中检查了 "Frames" window,在选择 returns 101 代码的请求之后。它显示单帧:"Binary Frame (Opcode 2, mask)".
此操作码是否引用 MQTT 控制代码 2 AKA "CONNACK"?我不是 MQTT 专家(还不是!)。
我通过阅读STS 上的文档意识到我的错误。
If you pass a policy to this operation, the temporary security credentials that are returned by the operation have the permissions that are allowed by both the access policy of the role that is being assumed, and the policy that you pass.
提供的 RoleARN 还必须允许您通过 STS assumeRole 请求的操作。
即RoleARN 可以允许 iot:*,然后当您担任角色时,您可以将权限缩小到例如 iot:Connect 和特定资源。