web-dev-qa-db-fra.com

Comment réparer l'erreur "La signature de la demande que nous avons calculée ne correspond pas à la signature"?

J'ai effectué des recherches sur le Web pendant plus de deux jours, et j'ai probablement parcouru la plupart des scénarios documentés en ligne et des solutions de contournement, mais rien n'a fonctionné pour moi jusqu'à présent.

Je suis sur AWS SDK pour PHP V2.8.7 sous PHP 5.3. J'essaie de me connecter à mon compartiment S3 avec le code suivant:

// 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();
        }
        //  

Mon fichier config.php est le suivant:

<?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'
                )
            )
        )
    )
);

Il produit l'erreur suivante:

La signature de demande que nous avons calculée ne correspond pas à la signature que vous avez fournie. Vérifiez votre clé et votre méthode de signature.

J'ai déjà vérifié ma clé d'accès et mon secret au moins 20 fois, en ai généré de nouvelles, utilisé différentes méthodes pour transmettre les informations (profil, informations d'identification incluses dans le code), mais rien ne fonctionne pour le moment.

25
Joseph Lam

Après deux jours de débogage, j'ai finalement découvert le problème ...

La clé que j’assignais à l’objet commençait par un point, c.-à-d.

Je souhaite que l'API fournisse un message d'erreur plus significatif et pertinent, hélas, j'espère que cela aidera quelqu'un d'autre!

28
Joseph Lam

Je reçois cette erreur avec les mauvais identifiants. Je pense qu'il y avait des personnages invisibles quand je l'ai collé à l'origine.

14
Alex Levine

J'ai eu le même problème lorsque j'ai essayé de copier un objet avec des caractères UTF8. Ci-dessous un exemple 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);

Résolu en encodant le CopySource avec encodeURIComponent()

5
ecdeveloper

En fait, en Java, je recevais la même erreur.Après avoir passé 4 heures à le déboguer, j’ai trouvé que le problème était lié aux métadonnées dans les objets S3, car il y avait de l’espace tout en maintenant des contrôles de cache dans les fichiers s3. version, mais dans 1.11. * il est interdit et génère donc l'erreur de non-concordance de signature

2
sarir

Je viens tout juste d’expérimenter le téléchargement d’une image sur S3 à l’aide du kit AWS SDK avec React Native. Cela s'est avéré être causé par le paramètre ContentEncoding.

Supprimer ce paramètre "corrige" le problème.

2
John Veldboom

Si aucune des solutions mentionnées ne vous convient, essayez d’utiliser

aws configure

cette commande ouvrira un ensemble d'options demandant les clés, la région et le format de sortie.

J'espère que cela t'aides!

1
monothorn

Je l'ai rencontré dans une image Docker, avec un point de terminaison non AWS S3, lors de l'utilisation de la dernière version awscli disponible pour Debian Stretch, à savoir la version 1.11.13.

La mise à niveau vers la CLI version 1.16.84 a résolu le problème.

Pour installer la dernière version de la CLI avec un fichier Docker basé sur une image étendue Debian, au lieu de:

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

Utilisation:

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

Dans mon cas (python), cela a échoué car j'avais dans le fichier ces deux lignes de code héritées d'un code

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

0
Nir Soudry

Je devais mettre 

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

avant avec Ruby aws sdk v2 (il existe probablement quelque chose de similaire à cela dans les autres langues également)

0
Yo Ludke

Dans mon cas, j'ai analysé une URL S3 dans ses composants.

Par exemple:

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

A été analysé dans:

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

Avoir la partie chemin contenant un '/' initial a échoué à la demande.

0
AVIDeveloper

J'ai eu une erreur similaire, mais pour moi, cela semblait être dû à la réutilisation d'un utilisateur IAM pour travailler avec S3 dans deux environnements Elastic Beanstalk différents. J'ai traité le symptôme en créant un utilisateur IAM ayant les mêmes autorisations pour chaque environnement, ce qui a permis d'éliminer l'erreur.

0
Joseph Combs

Je pourrais résoudre ce problème en définissant des variables d'environnement. 

export AWS_ACCESS_KEY=
export AWS_SECRET_ACCESS_KEY=

Dans IntelliJ + py.test, je définis les variables d'environnement avec [Run] > [Edit Configurations] > [Configuration] > [Environment] > [Environment variables]

0
MiaeKim

Pour moi, j'ai utilisé axios et par défaut, il envoie un en-tête

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

alors je change pour envoyer:

content-type: application/octet-stream

et devait également ajouter ce type de contenu à la signature AWS

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

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

Dans mon cas, le nom de compartiment était incorrect, il comprenait la première partie de la clé (bucketxxx/keyxxx) - la signature ne présentait aucun problème.

0
Martin Flower

Un autre problème possible pourrait être que les méta-valeurs contiennent des caractères non US-ASCII. Pour moi, cela a aidé UrlEncode les valeurs lors de leur ajout à putRequest:

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