AWS IOT - учетные данные должны быть ограничены для правильного обслуживания

Я пытаюсь получить доступ к простому сервису AWS IOT REST, но пока не смог. Вот что я сделал.

  1. Я создал пользователя iam в своем aws и загрузил ключ доступа и секретный ключ
  2. Авторизовался в AWS IOT с этим пользователем и создал "вещь"
  3. Из свойства вещи я нашел URL-адрес REST для тени
  4. Использовал почтальон с новой функцией «подпись aws» и предоставил ему ключ доступа, секретный ключ, регион (us-east-1) и имя службы (iot)
  5. Пытался "ПОЛУЧИТЬ" конечную точку, и вот что я получил -

    { "message": "Credential should be scoped to correct service. ", "traceId": "be056198-d202-455f-ab85-805defd1260d" }

  6. Я подумал, что с почтальоном что-то не так, поэтому я попытался использовать пример aws-sdk-sample подключения к S3 и изменил его, чтобы подключиться к URL-адресу IOT. Вот мой фрагмент программы (Java)

    String awsAccessKey = "fasfasfasdfsdafs";
    String awsSecretKey = "asdfasdfasfasdfasdfasdf/asdfsdafsd/fsdafasdf";
    
    URL  endpointUrl = null;
    String regionName = "us-east-1";
    try {
        endpointUrl = new URL("https://dasfsdfasdf.iot.us-east-1.amazonaws.com/things/SOMETHING/shadow");
    }catch (Exception e){
        e.printStackTrace();
    }
    Map<String, String> headers = new HashMap<String, String>();
    headers.put("x-amz-content-sha256", AWSSignerBase.EMPTY_BODY_SHA256);
    
    AWSSignerForAuthorizationHeader signer = new AWSSignerForAuthorizationHeader(
            endpointUrl, "GET", "iot", regionName);
    String authorization = signer.computeSignature(headers,
            null, // no query parameters
            AWSSignerBase.EMPTY_BODY_SHA256,
            awsAccessKey,
            awsSecretKey);
    
    // place the computed signature into a formatted 'Authorization' header
    // and call S3
    headers.put("Authorization", authorization);
    String response = HttpUtils.invokeHttpRequest(endpointUrl, "GET", headers, null);
    System.out.println("--------- Response content ---------");
    System.out.println(response);
    System.out.println("------------------------------------");
    

Это дает мне ту же ошибку -

--------- Request headers ---------
x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Authorization: AWS4-HMAC-SHA256 Credential=fasfasfasdfsdafs/20160212/us-east-1/iot/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=3b2194051a8dde8fe617219c78c2a79b77ec92338028e9e917a74e8307f4e914
x-amz-date: 20160212T182525Z
Host: dasfsdfasdf.iot.us-east-1.amazonaws.com
--------- Response content ---------
{"message":"Credential should be scoped to correct service. ","traceId":"cd3e0d96-82fa-4da5-a4e1-b736af6c5e34"}
------------------------------------

Кто-нибудь может сказать мне, что я делаю не так, пожалуйста? В документации AWS не так много информации об этой ошибке. Пожалуйста помоги


person Robby    schedule 12.02.2016    source источник
comment
ты решил проблему? Я с таким же   -  person Vinicius Zilli Pavei    schedule 08.03.2016
comment
такая же проблема здесь   -  person MeV    schedule 18.11.2016


Ответы (4)


Вместо этого подпишите свой запрос iotdata, если iot
пример:

AWSSignerForAuthorizationHeader signer = new AWSSignerForAuthorizationHeader(
    endpointUrl, "GET", "iotdata", regionName);
person Firas Al Mannaa    schedule 22.03.2016
comment
Застрял, пытаясь сделать это через Почтальона. Этот небольшой фрагмент об iotdata нигде не встречается в документации по API - спасибо. - person kert; 18.12.2016
comment
У AWS самые плохие документы, которые я когда-либо использовал. Потребовалось 3 дня и много проб и ошибок, прежде чем я наконец нашел эту небольшую деталь, которая устранила мою проблему. - person Mathyou; 14.01.2021

Это в основном из-за того, что имя службы указано неправильно, вы можете использовать имя службы = 'iotdata' вместо iot.

Если вы используете управление ключами, тогда Service Name будет kms. Для EC2 Service Name будет ec2 и т. Д.

person kartick shaw    schedule 03.10.2017

На 4-м шаге ничего не заполняйте для имени службы. Почтальон установит значение по умолчанию с помощью execute-api.

Надеюсь, это сработает!

person Alok Singh    schedule 29.12.2020

Вместо этого используйте SDK для Node.js AWS IoT. Загрузите сгенерированный консолью IoT закрытый ключ и сертификат клиента, а также сертификат CA Root со страницы здесь. Начните со сценариев в каталоге примеров.

person gboda    schedule 12.02.2016
comment
Это действительно не отвечает на заданный вопрос. - person alanwill; 29.03.2016