Подпись общего доступа IoT Hub в PowerShell

#powershell #azure-iot-hub

#powershell #azure-iot-hub

Вопрос:

Как создать подпись общего доступа IoT Hub с помощью PowerShell. Мой код работает при использовании подписи, сгенерированной в Azure IoT Explorer. Предположим, что что-то не так с генерацией подписи:

 $Uri = "$IotHubName.azure-devices.net/devices/$IotDeviceId"
$Expiry = [string](([DateTimeOffset]::Now.ToUnixTimeSeconds()) 3600)
$IotHubKeyDecoded = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($IotHubKey)) 
$StringToSign = [System.Web.HttpUtility]::UrlEncode($Uri)   "`n"   $Expiry
$Hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$Hmacsha.key = [Text.Encoding]::ASCII.GetBytes($IotHubKeyDecoded)
$Signature = $Hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($StringToSign))
$Signature = [System.Web.HttpUtility]::UrlEncode([Convert]::ToBase64String($Signature))
  

Я попытался использовать New-AzIotHubSasToken, но получил «Несанкционированный»:

 $SharedAccessSignature = New-AzIotHubSasToken -ResourceGroupName $IotHub.ResourceGroupName -IotHubName $IotHubName -DeviceId $IotDeviceId 
$Headers = @{"Authorization" = $SharedAccessSignature; "Content-Type"="application/json";} 
$Uri = "https://$IotHubName.azure-devices.net/devices/$IotDeviceId/messages/events?api-version=2020-03-13" 
Invoke-RestMethod -Uri $Uri -Headers $Headers -Method Post -Body $JsonBody
  

Комментарии:

1. Попробовали ли вы командлет New-AzIotHubSasToken ?

2. Правильный способ сделать это — использовать New-AzIotHubSasToken. Причиной, по которой это не сработало для меня, была ошибка в модуле PowerShell. Это должно быть исправлено в выпуске от 8 декабря 2020 года.

Ответ №1:

Я не уверен, почему вы пытаетесь создать токен SAS таким образом, но для этой цели вы можете использовать либо PowerShell, либо Azure CLI (сначала его необходимо установить).

Здесь у вас есть оба примера:

 # PowerShell
New-AzIotHubSasToken -IotHubName "{IoT Hub Name}" -DeviceId "{Device Id}" -ResourceGroupName "{Resource Group Name}"

# Output
SharedAccessSignature sr={IoT Hub Name}.azure-devices.net%2fdevices/{Device Id}amp;sig=iuhiAfagvhgd3QtqjukX8upPuWj%2fuJuYn+JgeOe6Uwo=amp;se=1604085022

# Azure CLI
az iot hub generate-sas-token -n {IoT Hub Name} -d {Device Id}

# Output
{
  "sas": "SharedAccessSignature sr={IoT Hub Name}.azure-devices.net/devices/{Device Id}amp;sig=iuhiAfagvhgd3QtqjukX8upPuWj/uJuYn+JgeOe6Uwo=amp;se=1604085022"
}
  

Помните, что сначала вы должны войти в систему, а затем выбрать соответствующую подписку (в случае, если у вас более одной)

 az login
# Optionally: az account list
az account set --subscription {subscription id}
  

Комментарии:

1. Это правильный способ сделать это. Причиной, по которой это не сработало для меня, была ошибка в модуле PowerShell. Это должно быть исправлено в выпуске от 8 декабря 2020 года.