403 подключение к веб-сокету IoT с использованием подписанного URL - PullRequest
0 голосов
/ 21 февраля 2019

Я пытался подключиться к IoT MQTT в веб-браузере, поэтому я генерирую подписанный URL-адрес и подключаюсь к Paho.Однако, несмотря на то, что я генерирую подписанный URL-адрес, используя роль IAM, к которой прикреплена политика AWSIoTFullAccess (и, следовательно, должен иметь доступ ко всем операциям IoT на всех ресурсах!), Я получаю ошибку 403 при каждом подключении (используя Pahoили WSCAT).Вот код, который я использую для генерации подписанного URL:

@APP.route(VERSION_PREFIX + 'signedurl', methods=['GET'])
def get_signed_url():
  session = STS.assume_role(RoleArn=IAM_ROLE_ARN,
        RoleSessionName=str(uuid.uuid4()))['Credentials']
  endpt = os.getenv('REALTIME_WSS_ENDPT')

  t = datetime.datetime.utcnow()
  amzdate = t.strftime('%Y%m%dT%H%M%SZ')
  datestamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope

  method = 'GET'
  protocol = 'wss'
  uri = '/mqtt'
  service = 'iotdevicegateway'
  algorithm = 'AWS-HMAC-SHA256'

  credential_scope = f"{datestamp}/us-west-2/{service}/aws4_request"
  canonical_query = "X-Amz-Algorithm=" + algorithm
  canonical_query += "&X-Amz-Credential=" + urllib.parse.quote_plus(session['AccessKeyId'] + '/' + credential_scope, safe='')
  canonical_query += "&X-Amz-Date=" + amzdate
  canonical_query += "&X-Amz-Expires=86400"
  canonical_query += "&X-Amz-SignedHeaders=host"

  canonical_headers = "host:" + endpt
  payload_hash = hashlib.sha256(('').encode('utf-8')).hexdigest()
  canonical_request = f"{method}\n{uri}\n{canonical_query}\n{canonical_headers}\nhost\n{payload_hash}"

  string_to_sign = f"{algorithm}\n{amzdate}\n{credential_scope}\n{hashlib.sha256(canonical_request.encode('utf-8')).hexdigest()}"
  signing_key = get_signature_key(session['SecretAccessKey'], datestamp, 'us-west-2', service)
  signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest()

  canonical_query += "&X-Amz-Signature=" + signature
  canonical_query += "&X-Amz-Security-Token=" + urllib.parse.quote_plus(session['SessionToken'], safe='')
  return make_response(f"{protocol}://{endpt}{uri}?{canonical_query}")

Я следовал примеру MQTT поверх WSS настолько точно, насколько это возможно, и моя предполагаемая роль имеет все разрешения IoT.Что я тут не так делаю?

...