Ongeldige S3-handtekeningfout bij gebruik van server-side encryptie en ASIHTTPRequest van een iPhone-app

Ik heb een iPhone-applicatie die ik al een tijdje gebruik en die ASIHTTPRequest gebruikt om video's naar een bucket op Amazon S3 te uploaden. Het functioneerde goed zonder problemen. Onlangs hebben we besloten om gebruik te maken van de nieuwe "server-side encryptie" die Amazon heeft geïmplementeerd. Hiermee kunt u de Amazon-server vertellen bestanden die in een bucket zijn geplaatst automatisch te coderen door een extra HTTP -header op te nemen.

Ik heb een enkele coderegel aan mijn toepassing toegevoegd om dit te implementeren, maar nu zijn mijn Amazon-uploads mislukt. De specifieke foutmelding die verschijnt is:

"De handtekening van de aanvraag die we hebben berekend, komt niet overeen met de handtekening die u heeft opgegeven. Controleer uw sleutel en de ondertekeningsmethode."

De naam van de bucket die ik gebruik, voldoet aan de naamgevingsnormen van Amazon, dus ik ben er zeker van dat dit niet het probleem is. Ik ben er ook van overtuigd dat de geheime en publieke sleutels die ik gebruik correct zijn.

Het lijkt erop dat het toevoegen van deze header op de een of andere manier de handtekeningberekening doorbreekt, want ik veronderstel dat deze wordt opgenomen in de berekening aan de ene kant van de uitzending, maar niet aan de andere.

Doe ik dit verkeerd? Of is dit een fout in ASIHTTPRequest ?

Hier is mijn code voor referentie:

[ASIS3Request setSharedSecretAccessKey:@"mysecretkey"];
[ASIS3Request setSharedAccessKey:@"myaccesskey"];

NSString *bucketPath = [NSString stringWithFormat:@"mypath/filename"];

ASIS3ObjectRequest *request = [ASIS3ObjectRequest PUTRequestForFile:filepath withBucket:@"my-bucket" key:bucketPath];

// If the following line is commented, the upload completes successfully
[request addRequestHeader:@"x-amz-server-side-encryption" value:@"AES256"];
////

request.requestScheme = ASIS3RequestSchemeHTTPS;
[request setShouldContinueWhenAppEntersBackground:YES];
[request startSynchronous];

if ([request error])
{
 //The error messag is being displayed here
  NSLog(@"xmit error: [%@]",[[request error] localizedDescription]);
}
1

2 antwoord

U doet alles goed, het probleem is dat het samenstellen van de Autorisatie -kop (dwz "de handtekening van de aanvraag") betrekking heeft op een tekenreeks ondertekenen die alle x-amz - headers bevat; je hebt een dergelijke header ( x-amz-server-side-encryptie ) toegevoegd, maar je hebt niet gezorgd dat deze in de handtekening is verwerkt.

Ik heb zojuist een tak van ASIHTTPRequest gemaakt met ondersteuning voor SSE . Als u die branch gebruikt, moet u gewoon [request setUseServerSideEncryption: YES]; kunnen zeggen. Als alternatief, als je meer geïnteresseerd bent in de techniek, hier zijn de details om het te maken werken .

0
toegevoegd
Mooi dankje!
toegevoegd de auteur jzn, de bron

Ik heb hetzelfde probleem, maar ik gebruik geen codering. Maar wat ik tot nu toe heb gevonden is dat hoofdletters de verkeerde handtekening krijgen.

In mijn geval stel ik de opslagklasse in met ASIS3StorageClassReducedRedundancy met de waarde @ "REDUCED_REDUNDANCY" die in hoofdletters is. Als ik deze optie niet instel, wordt het verzoek voltooid.

Dus misschien zit je probleem met de waarde AES256 die hoofdletters heeft.

0
toegevoegd