开发模块时如何获取sasKey或connectionString?

问题描述

我正在尝试编写一个无法使用当前 ModuleClient.CreateFromEnvironmentAsync() 的模块,并且想要获取模块连接字符串(或 SASKey),以便我可以生成 SAS 令牌并进行身份验证。

我知道曾经(在 IoTEdgeDev 容器中)环境变量 EdgeHubConnectionString 存在,后来被删除。如何在模块中的代码中导出 sasKey?如果我需要/想要在模块中使用 Paho 而不是 MSFT 提供的 SDK,则进行成像。

解决方法

我查看了 C# SDKModuleClient.CreateFromEnvironmentAsync() 的实现。它使用以下环境变量来创建连接字符串:

- IOTEDGE_WORKLOADURI          URI for iotedged's workload API
- IOTEDGE_DEVICEID             Device identifier
- IOTEDGE_MODULEID             Module identifier
- IOTEDGE_MODULEGENERATIONID   Module generation identifier
- IOTEDGE_IOTHUBHOSTNAME       IoT Hub host name
- IOTEDGE_AUTHSCHEME           Authentication scheme to use; must be "sasToken"

似乎 SAS 令牌是在 ModuleAuthenticationWithHsm 类中创建的,您可以以此为基础编写代码吗?

,

经过数小时的迭代,这里是如何调用签名 API 来获取 SAS 令牌:

# expecting curl,base64 and jq to be installed in the Linux OS
epoch=$(printf '%(%s)T\n' -1)
epoch=$(($epoch+86400))
WORKLOADURI=$(echo $IOTEDGE_WORKLOADURI | sed "s|unix://|""|g")
uri=$(echo $IOTEDGE_IOTHUBHOSTNAME"/devices/"$IOTEDGE_DEVICEID"/modules/"$IOTEDGE_MODULEID | sed "s|/|%2F|g")
signedData=$(echo -n $uri$'\n'$epoch | base64 -w 0)
signature=$(curl --unix-socket $WORKLOADURI http://127.0.0.1/modules/$IOTEDGE_MODULEID/genid/$IOTEDGE_MODULEGENERATIONID/sign?api-version=$IOTEDGE_APIVERSION \
    --request POST --data '{"data": "'$signedData'","keyId": "","algo": "HMAC-SHA256"}' \
    | jq -r ".digest" | sed "s|=|%3D|g" | sed "s|+|%2B|g" | sed "s|/|%2F|g")

# here is our SAS Token
SASToken="SharedAccessSignature=SharedAccessSignature sr=$uri&sig=$signature&se=$epoch"
# here is a connection string with the SAS Token
ConnectionString="HostName=$IOTEDGE_IOTHUBHOSTNAME;DeviceId=$IOTEDGE_DEVICEID;ModuleId=$IOTEDGE_MODULEID;$SASToken"