Загрузка ледника AWS InvalidSignatureException C#
Я пробовал AWS SDK для.NET и столкнулся со следующей проблемой. Я не могу заставить загрузку работать.
То, что я пытаюсь сделать, это:
class ArchiveUploadSingleOpLowLevel
{
static string vaultName = "test001";
static string archiveToUpload = "ver.txt"; //located in the same directory as the executable
public static void Upload()
{
AmazonGlacierClient client;
try
{
using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.EUWest1))
{
Console.WriteLine("Uploading an archive.");
string archiveId = UploadAnArchive(client);
Console.WriteLine("Archive ID: {0}", archiveId);
}
Console.WriteLine("To continue, press Enter");
Console.ReadKey();
}
catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
catch (Exception e) { Console.WriteLine(e.Message); }
Console.WriteLine("To continue, press Enter");
Console.ReadKey();
}
static string UploadAnArchive(AmazonGlacierClient client)
{
using (FileStream fileStream = new FileStream(archiveToUpload, FileMode.Open, FileAccess.Read))
{
string treeHash = TreeHashGenerator.CalculateTreeHash(fileStream);
UploadArchiveRequest request = new UploadArchiveRequest()
{
VaultName = vaultName,
Body = fileStream,
Checksum = treeHash
};
UploadArchiveResponse response = client.UploadArchive(request);
string archiveID = response.ArchiveId;
return archiveID;
}
}
}
Но результат, который я продолжаю получать, - это AmazonGlacierException:
InvalidSignatureException
The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
The Canonical String for this request should have been
'POST
/-/vaults/test001/archives
content-type:binary/octet-stream
host:glacier.eu-west-1.amazonaws.com
user-agent:aws-sdk-dotnet-45/2.0.4.0 .NET Runtime/4.0 .NET Framework/4.0 OS/6.2.9200.0
x-amz-content-sha256:2a7087861fb29e1f77da3600df98a9d3b0d1e8dee8d65700a6f2a5599c5a50ae, 2a7087861fb29e1f77da3600df98a9d3b0d1e8dee8d65700a6f2a5599c5a50ae
x-amz-date:20131230T114010Z
x-amz-glacier-version:2012-06-01
x-amz-sha256-tree-hash:2a7087861fb29e1f77da3600df98a9d3b0d1e8dee8d65700a6f2a5599c5a50ae
x-amz-target:Glacier.UploadArchive
content-type;host;user-agent;x-amz-content-sha256;x-amz-date;x-amz-glacier-version;x-amz-sha256-tree-hash;x-amz-target
2a7087861fb29e1f77da3600df98a9d3b0d1e8dee8d65700a6f2a5599c5a50ae, 2a7087861fb29e1f77da3600df98a9d3b0d1e8dee8d65700a6f2a5599c5a50ae'
The String-to-Sign should have been
'AWS4-HMAC-SHA256
20131230T114010Z
20131230/eu-west-1/glacier/aws4_request
d405bac6780608e6fc3f7091dc5a9aa1d4d0d8415d61732feba6b9970678d40f'
Теперь очевидной ошибкой будет то, что у меня неверный AWSAccessKey или AWSSecretKey в моей конфигурации. Я проверял и переписывал / вставлял их снова и снова. Документация и API высокого уровня не дают мне много информации о методе подписания.
Также я успешно создал и перечислил свои хранилища в том же приложении.
Поэтому я склоняюсь к проблеме кодирования, связанной с TreeHashGenerator из-за того, что я использую.Net 4.5, VS2012 SP3 на win8.1 (английская версия).
Но это было бы предположение. Кто-нибудь когда-нибудь сталкивался с подобной проблемой?
С уважением, Мартин
1 ответ
Я обменялся несколькими сообщениями через Twitter с AWS SDK для команды.NET, и они обнаружили ошибку. Эта проблема была решена в версии 2.0.6.1 SDK и теперь доступна в Nuget.