AWS S3 - Come correggere l'errore "La firma della richiesta che abbiamo calcolato non corrisponde alla firma"?


97

Ho cercato sul Web per più di due giorni e probabilmente ho esaminato la maggior parte degli scenari documentati in linea e delle soluzioni alternative, ma finora niente ha funzionato per me.

Sono in AWS SDK per PHP V2.8.7 esecuzione su PHP 5.3.

Sto provando a connettermi al mio bucket S3 con il seguente codice:

// Create a `Aws` object using a configuration file

        $aws = Aws::factory('config.php');

        // Get the client from the service locator by namespace
        $s3Client = $aws->get('s3');

        $bucket = "xxx";
        $keyname = "xxx";

        try {
            $result = $s3Client->putObject(array(
                'Bucket'        =>      $bucket,
                'Key'           =>      $keyname,
                'Body'          =>      'Hello World!'
            ));
            $file_error = false;
        } catch (Exception $e) {
            $file_error = true;
            echo $e->getMessage();
            die();
        }
        //  

Il mio file config.php è il seguente:

<?php

return array(
    // Bootstrap the configuration file with AWS specific features
    'includes' => array('_aws'),
    'services' => array(
        // All AWS clients extend from 'default_settings'. Here we are
        // overriding 'default_settings' with our default credentials and
        // providing a default region setting.
        'default_settings' => array(
            'params' => array(
                'credentials' => array(
                    'key'    => 'key',
                    'secret' => 'secret'
                )
            )
        )
    )
);

Sta producendo il seguente errore:

La firma della richiesta che abbiamo calcolato non corrisponde alla firma che hai fornito. Controlla la tua chiave e il metodo di firma.

Ho già controllato la mia chiave di accesso e il mio segreto almeno 20 volte, ne ho generati di nuovi, ho usato diversi metodi per passare le informazioni (es. Profilo e includendo le credenziali nel codice) ma al momento non funziona nulla.


3
Pertanto, l'SDK AWS implementa solo una serie di chiamate API dirette. Con AWS, ogni singola chiamata che effettui prende la tua chiave privata (o secretsuperiore) e la utilizza per calcolare una firma in base alla tua chiave di accesso, al timestamp corrente e a una serie di altri fattori. Vedi docs.aws.amazon.com/general/latest/gr/… . È un colpo lungo, ma dato che includono il timestamp, forse il tempo del tuo ambiente locale è scaduto?
Josh Padnick,

È successo quando abbiamo passato una dimensione errata ( Content-Length) nei metadati degli oggetti. (Versione lunga: stavamo passando direttamente il flusso di input da un Java HttpServletRequestal cliente S3, e passando request.getContentLength()da Content-Lengthvia metadati; quando il servlet era (richieste a caso) la ricezione divisi in blocchi ( Transfer-Encoding: chunked), getContentLength()era di ritorno -1- che ha portato putObjectal fallimento (in modo casuale). Oscuro; ma chiaramente è colpa nostra perché stavamo passando una dimensione di oggetto errata.)
Janaka Bandara

Josh il tempo del mio laptop era un'ora di riposo (per qualche motivo era impostato su Mosca e non su Londra). Grazie per l'aiuto!
Ross Symonds

Risposte:


83

Dopo due giorni di debug, ho finalmente scoperto il problema ...

La chiave che stavo assegnando all'oggetto iniziava con un punto, ad es. ..\images\ABC.jpg, E questo ha causato l'errore.

Vorrei che l'API fornisse un messaggio di errore più significativo e pertinente, ahimè, spero che questo possa aiutare qualcun altro là fuori!


Avevo il secchio di stato e la chiave all'indietro e questo è l'errore che ottieni (la firma non corrisponde). Wtf terraform?
Lo-Tan

17
Anche un taglio iniziale ha causato questo problema per me. Hai bisogno solo di percorso / a / file, non / percorso / a / file
Graham

4
E per me il problema erano gli spazi bianchi all'interno della chiave
Adam Szmyd

4
Per aggiungere a questo, stavo ricevendo questo messaggio di errore quando avevo un segno più +nella mia chiave.
LCC

2
Ho ricevuto questo messaggio quando non ho fornito l' Content-Typeintestazione nella mia richiesta di caricamento del file
fornivo Angel Venchev

38

Ottengo questo errore con le credenziali sbagliate. Penso che ci fossero caratteri invisibili quando l'ho incollato originariamente.


3
Ho semplicemente fatto doppio clic key_hash_lala/key_hash_continuese ha selezionato solo una parte. Ahimè, quanto è difficile dire all'utente "password sbagliata, amico!"?
UFO

La prima volta che ho avuto problemi a copiare la chiave dal csv scaricabile. Per la seconda chiave che ho creato, l'ho appena copiata dal browser e non ho avuto problemi
nthaxis

+1 a @nthaxis - la copia da .csv ha causato un errore - la copia direttamente dal browser e funziona a
meraviglia

Per me è stato anche il risultato di credenziali sbagliate. Mi mancava un personaggio nelle mie credenziali.
Prometti Preston

15

Ho avuto lo stesso problema quando ho provato a copiare un oggetto con alcuni caratteri UTF8. Di seguito è riportato un esempio JS:

var s3 = new AWS.S3();

s3.copyObject({
    Bucket: 'somebucket',
    CopySource: 'path/to/Weird_file_name_ðÓpíu.jpg',
    Key: 'destination/key.jpg',
    ACL: 'authenticated-read'
}, cb);

Risolto codificando il CopySource con encodeURIComponent()


12

Questo errore sembra verificarsi principalmente se c'è uno spazio prima o dopo la tua chiave segreta


questo è un aiuto completo
Mr S Coder

Ho avuto lo stesso problema. Skype a volte copia i valori con righe vuote. Basta incollarlo nel blocco note e quindi copiarlo senza spazi bianchi.
michal-michalak

Sì ! Controlla anche se hai spazi in altre intestazioni.
Eino Gourdin

6

In realtà in Java stavo ricevendo lo stesso errore Dopo aver trascorso 4 ore per eseguire il debug, ho scoperto che il problema era nei metadati in S3 Objects poiché c'era spazio mentre sedevo i controlli della cache nei file s3.Questo spazio era consentito in 1.6. * versione ma nella 1.11. * non è consentita e quindi generava l'errore di mancata corrispondenza della firma


Succede anche se passi un errore Content-Lengthnei metadati
Janaka Bandara

4

Per me ho usato axios e da deafult invia header

content-type: application/x-www-form-urlencoded

quindi cambio per inviare:

content-type: application/octet-stream

e ha anche dovuto aggiungere questo tipo di contenuto alla firma AWS

const params = {
    Bucket: bucket,
    Key: key,
    Expires: expires,
    ContentType = 'application/octet-stream'
}

const s3 = new AWS.S3()
s3.getSignedUrl('putObject', params)

3

Se nessuna delle altre soluzioni menzionate funziona per te, prova a utilizzare

aws configure

questo comando aprirà una serie di opzioni che richiedono chiavi, regione e formato di output.

Spero che sia di aiuto!


3

In una versione precedente di aws-php-sdk, prima della deprecazione del S3Client::factory()metodo, era consentito posizionare parte del percorso del file, o Keycome viene chiamato nei S3Client->putObject()parametri , sul parametro bucket. Avevo un file manager in uso in produzione, utilizzando l'SDK v2. Poiché il metodo factory funzionava ancora, non ho rivisitato questo modulo dopo l'aggiornamento a ~3.70.0. Oggi ho passato la maggior parte delle due ore a eseguire il debug del motivo per cui avevo iniziato a ricevere questo errore, e alla fine è stato dovuto ai parametri che stavo passando (che funzionavano):

$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2006-03-01'
]);
$result = $s3Client->putObject([
    'Bucket' => 'awesomecatpictures/catsinhats',
    'Key' => 'whitecats/white_cat_in_hat1.png',
    'SourceFile' => '/tmp/asdf1234'
]);

Ho dovuto spostare la catsinhatsporzione del mio bucket / percorso chiave sul Keyparametro, in questo modo:

$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2006-03-01'
]);
$result = $s3Client->putObject([
    'Bucket' => 'awesomecatpictures',
    'Key' => 'catsinhats/whitecats/white_cat_in_hat1.png',
    'SourceFile' => '/tmp/asdf1234'
]);

Quello che credo stia accadendo è che il file Bucket nome è ora codificato in URL. Dopo un'ulteriore ispezione del messaggio esatto che stavo ricevendo dall'SDK, ho trovato questo:

Errore durante l'esecuzione PutObjectsuhttps://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png

Errore HTTP AWS: errore del client: ha PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.pnggenerato un file403 Forbidden

Questo mostra che il parametro che /ho fornito al mio Bucketparametro è stato completato urlencode()e lo è ora %2F.

Il modo in cui funziona la firma è abbastanza complicato, ma il problema si riduce al secchio e la chiave viene utilizzata per generare la firma crittografata. Se non corrispondono esattamente sia sul client chiamante che all'interno di AWS, la richiesta verrà negata con un 403. Il messaggio di errore indica effettivamente il problema:

La firma della richiesta che abbiamo calcolato non corrisponde alla firma che hai fornito. Controlla la tua chiave e il metodo di firma.

Quindi, il mio Keyera sbagliato perché il mio Bucketera sbagliato.


3

Ho avuto lo stesso errore in nodejs. Ma l'aggiunta signatureVersiondel costruttore s3 mi ha aiutato:

const s3 = new AWS.S3({
  apiVersion: '2006-03-01',
  signatureVersion: 'v4',
});

Ho provato molte cose prima di imbattermi in questo! Questa è stata la risposta per me.
DavidG

3

Nel mio caso stavo usando s3.getSignedUrl('getObject')quando dovevo usare s3.getSignedUrl('putObject')(perché sto usando un PUT per caricare il mio file), motivo per cui le firme non corrispondevano.


Mi ha salvato dopo lunghe ore. Grazie!!
Kisinga


2

Ho appena sperimentato questo caricamento di un'immagine su S3 utilizzando l'SDK AWS con React Native. È risultato essere causato dalContentEncoding parametro.

La rimozione di quel parametro ha "risolto" il problema.


2

Ho avuto lo stesso problema. Avevo il metodo predefinito, PUT impostato per definire l'URL pre-firmato ma stavo cercando di eseguire un GET. L'errore era dovuto alla mancata corrispondenza del metodo.


Questo ha funzionato per me. Il verbo HTTP (PUT, POST) utilizzato per generare l'URL firmato deve essere lo stesso del verbo utilizzato quando si esegue un caricamento con quell'URL.
craigcaulfield

1

Ho riscontrato un errore simile, ma per me sembrava essere stato causato dal riutilizzo di un utente IAM per lavorare con S3 in due diversi ambienti Elastic Beanstalk. Ho trattato il sintomo creando un utente IAM con autorizzazioni identiche per ogni ambiente e questo ha fatto scomparire l'errore.


1

Nel mio caso ho analizzato un URL S3 nei suoi componenti.

Per esempio:

Url:    s3://bucket-name/path/to/file

È stato analizzato in:

Bucket: bucket-name
Path:   /path/to/file

La presenza della parte del percorso contenente una "/" iniziale non ha superato la richiesta.


1

Un altro possibile problema potrebbe essere che i meta valori contengono caratteri non US-ASCII. Per me ha aiutato a UrlEncode i valori quando li si aggiunge a putRequest:

request.Metadata.Add(AmzMetaPrefix + "artist", HttpUtility.UrlEncode(song.Artist));
request.Metadata.Add(AmzMetaPrefix + "title", HttpUtility.UrlEncode(song.Title));

1

Ho risolto questo problema modificando le autorizzazioni pubbliche sul mio bucket AWS s3 e aggiungendo la configurazione CORS di seguito alle impostazioni del bucket.

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

Consulta la documentazione di AWS s3 per ulteriori informazioni.


1

Il più delle volte succede a causa della chiave sbagliata (AWS_SECRET_ACCESS_KEY). Verifica in modo incrociato il tuo AWS_SECRET_ACCESS_KEY. Spero che funzioni ...


1

Ho ricevuto questo errore durante il tentativo di copiare un oggetto. L'ho risolto codificando il copySource. Questo è effettivamente descritto nella documentazione del metodo:

Params: copySource - Il nome del bucket di origine e il nome della chiave dell'oggetto di origine, separati da una barra (/). Deve essere codificato in URL.

CopyObjectRequest objectRequest = CopyObjectRequest.builder()
                .copySource(URLEncoder.encode(bucket + "/" + oldFileKey, "UTF-8"))
                .destinationBucket(bucket)
                .destinationKey(newFileKey)
                .build();

1

Nel mio caso, stavo utilizzando S3 (maiuscolo) come nome del servizio durante la richiesta utilizzando il postino nel metodo di autorizzazione della firma AWS


puoi aggiungere ulteriori dettagli su dove inserire AWS Sign?
Mr S Coder

1

Dopo aver eseguito il debug e aver trascorso molto tempo, nel mio caso, il problema era con access_key_id e secret_access_key, controlla due volte le tue credenziali o generane una nuova se possibile e assicurati di passare le credenziali in params.


Quando ho letto la risposta sopra, ho ricontrollato la mia chiave segreta e mi sono reso conto di aver aggiunto / alla fine.
Ezrqn Kemboi

0

Nel mio caso il nome del bucket era sbagliato, includeva la prima parte della chiave (bucketxxx / keyxxx) - non c'era nulla di sbagliato nella firma.


0

Nel mio caso (python) non è riuscito perché avevo queste due righe di codice nel file, ereditate da un codice precedente

http.client.HTTPConnection._http_vsn = 10 http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'


0

Ho riscontrato questo problema in un'immagine Docker, con un endpoint non AWS S3, quando si utilizza l'ultimo awscli versione disponibile per Debian stretch, ovvero la versione 1.11.13.

L'aggiornamento alla versione CLI 1.16.84 ha risolto il problema.

Per installare l'ultima versione della CLI con un Dockerfile basato su un'immagine allungata di Debian, invece di:

RUN apt-get update
RUN apt-get install -y awscli
RUN aws --version

Uso:

RUN apt-get update
RUN apt-get install -y python-pip
RUN pip install awscli
RUN aws --version

0

Ho dovuto impostare

Aws.config.update({
  credentials: Aws::Credentials.new(access_key_id, secret_access_key)
})

prima con ruby ​​aws sdk v2 (probabilmente c'è qualcosa di simile a questo anche nelle altre lingue)


0

Non so se qualcuno sia arrivato a questo problema mentre provava a testare l'URL emesso nel browser, ma se stai usando Postmane provi a copiare l'URL generato di AWS dalRAW scheda, a causa dell'escape dei backslash otterrai l'errore precedente .

Usa la Prettyscheda per copiare e incollare l'URL per vedere se funziona effettivamente.

Mi sono imbattuto in questo problema di recente e questa soluzione ha risolto il mio problema. È a scopo di test per vedere se recuperi effettivamente i dati tramite l'URL.

Questa risposta è un riferimento a coloro che provano a generare un download, un collegamento temporaneo da AWS o generalmente generano un URL da AWS da utilizzare.


0

Il problema nel mio caso era l'URL del gateway API utilizzato per configurare Amplify che aveva una barra in più alla fine ...

L'URL interrogato sembrava https://....amazonaws.com/myapi//myendpoint. Ho rimosso la barra in più nella configurazione e ha funzionato.

Non il messaggio di errore più esplicito della mia vita.


0

Nel mio caso stavo chiamando s3request.promise().then()incorrettamente che ha causato due esecuzioni della richiesta quando è stata eseguita una sola chiamata.

Quello che voglio dire è che stavo iterando attraverso 6 oggetti ma sono state fatte 12 richieste (puoi controllare accedendo alla console o eseguendo il debug della rete nel browser)

Poiché il timestamp per la seconda richiesta, indesiderata, non corrispondeva al segno della prima, questo ha prodotto questo problema.


0

Ho ricevuto questo errore durante il caricamento del documento su CloudSearch tramite Java SDK. Il problema era dovuto a un carattere speciale nel documento da caricare. L'errore "La firma della richiesta che abbiamo calcolato non corrisponde alla firma che hai fornito. Controlla la tua chiave di accesso segreta AWS e il metodo di firma". è molto fuorviante.


0

la generazione di una nuova chiave di accesso ha funzionato per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.