PowerShell生成Azure存储账户SAS令牌遇403认证错误求助
Azure存储账户SAS令牌生成403错误的解决方法
问题根源
你的脚本存在三个核心错误,导致签名字符串与Azure要求不匹配,触发403认证失败:
- 变量名大小写错误:
stringToSign末尾使用了未定义的$signedversion变量,实际应为$serviceVersion(PowerShell变量区分大小写)。 - 换行符解析错误:双引号字符串中
\n不会被PowerShell解析为换行符,导致签名字符串格式完全错误。 - 签名未URL编码:生成的Base64签名包含
+、/、=等URL特殊字符,直接拼接会破坏参数结构。
修正后的完整脚本
# Azure存储账户信息 $storageAccountName = "name" $storageAccountKey = "key" $baseUrl = "https://$storageAccountName.blob.core.windows.net" # SAS令牌参数 $permissions = "rwdlacup" # 权限:读、写、删除、列表、添加、创建、更新、处理 $serviceVersion = "2022-11-02" # API版本 $expiryDate = "2024-12-13T22:41:13Z" # 过期时间 $startDate = "2024-12-13T14:41:13Z" # 生效时间 $signedServices = "bqtf" # 服务:Blob、Queue、Table、File $signedResourceTypes = "sco" # 资源类型:服务、容器、对象 $signedIP = "" # 无IP限制 $signedProtocol = "https" # 仅允许HTTPS # 生成符合要求的签名字符串(使用PowerShell原生换行符`n,修正变量名) $stringToSign = "$storageAccountName`n$permissions`n$signedServices`n$signedResourceTypes`n$startDate`n$expiryDate`n$signedIP`n$signedProtocol`n$serviceVersion" # 计算HMAC SHA-256签名 $hmac = New-Object System.Security.Cryptography.HMACSHA256 $hmac.Key = [Convert]::FromBase64String($storageAccountKey) $sigBytes = $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($stringToSign)) $sig = [Convert]::ToBase64String($sigBytes) # 对签名进行URL编码,避免特殊字符破坏参数 $encodedSig = [Uri]::EscapeDataString($sig) # 拼接SAS令牌(修正URL拼接的斜杠问题) $sasToken = "?sv=$serviceVersion&ss=$signedServices&srt=$signedResourceTypes&sp=$permissions&se=$expiryDate&st=$startDate&spr=$signedProtocol&sig=$encodedSig" # 生成完整访问URL $fullUrl = "$baseUrl$sasToken"
验证步骤
- 对比Azure门户生成的SAS参数(权限、服务类型、时间范围等),确保脚本中所有参数完全一致。
- 使用修正后的URL测试
azcopy,确认无多余斜杠或编码错误。
内容的提问来源于stack exchange,提问作者piter22g
相关产品推荐
相关产品推荐

