2017-03-03 93 views
0

我在使用临时凭证使用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的专家(还!)。

回答

0

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

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

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

即RoleARN可以允许iot:*,那么当您承担角色时,您可以缩小权限,例如iot:Connect和特定资源。

相关问题