具有STS临时凭证的AWS IoT MQTT over Websocket

时间:2017-03-03 18:45:23

标签: amazon-web-services websocket mqtt aws-iot

我在使用临时凭证来使用STS临时凭证启动与AWS IoT的连接时遇到问题,同时保证安全。

我已经使用带有策略的证书成功连接了嵌入式设备。 但是,当我尝试通过浏览器进行连接时,使用预先签名的URL,我遇到了绊脚石。

以下是Lambda函数的代码片段,它首先验证请求(未显示),然后通过assumeRole使用STS凭证构建URL。

使用我生成的URL以及Paho javascript客户端,我已经成功地接收了#34; 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});
});

编辑:如果有帮助,我只是检查了#34;框架"选择返回101代码的请求后,Chrome调试器中的窗口。它显示了一个帧:"二进制帧(操作码2,掩码)"。

此操作码是否参考MQTT控制代码2 AKA" CONNACK"?我不是MQTT的专家(还有!)。

1 个答案:

答案 0 :(得分:1)

通过阅读STS上的文档,我意识到了自己的错误。

  

如果将策略传递给此操作,则操作返回的临时安全凭证具有正在假定的角色的访问策略和您传递的策略所允许的权限。

提供的RoleARN还必须允许您通过STS的请求执行的操作。

即。 RoleARN可以允许iot:*,然后当你担任角色时,你可以将权限缩小到例如iot:Connect和特定资源。