2016-01-06 1 views
1

J'ai un compartiment appartenant à un autre compte. En utilisant l'AWS CLI, je peux accéder à (liste et lire des objets) ce seau. Par exemple:SignatureDoesNotMatch dans AWS Java SDK pour S3

Répertorie les objets.

En essayant de recréer le même en utilisant le SDK Java (en Scala) j'obtiens l'exception ci-dessus (SignatureDoesNotMatch).

Voici le code:

package com.myco.sample 

class TestCase() { 
    val credentials = new com.amazonaws.auth.BasicAWSCredentials(
     "ACCESS_KEY_ID", 
     "SECRET_ACCESS_KEY" 
    ) 
    val s3 = new com.amazonaws.services.s3.AmazonS3Client(credentials) 
    val endpoint = "somebucket.s3-us-west-2.amazonaws.com" 
    s3.setEndpoint(endpoint) 

    try { 
     val objs = s3.listObjects("foo/bar") 
    } catch { 
     case ace: com.amazonaws.services.s3.model.AmazonS3Exception => { 
      println(ace.getAdditionalDetails) 
     } 
    } 
} 

L'appel à listObjects déclenche une exception. La sortie est:

com.amazonaws.services.s3.model.AmazonS3Exception: The request signature we calculated does not match the signature you provided. Check your key and signing method. (Service: Amazon S3; Status Code: 403; Error Code: SignatureDoesNotMatch; Request ID: XXXXXXXXX), S3 Extended Request ID: XXXXXXXXXXXXXXXXXXX= 
{SignatureProvided=XXXXXXXXXXXXX=, StringToSign=Wed, 06 Jan 2016 04:32:38 GMT 
/somebucket/foo/bar/, AWSAccessKeyId=XXXXXX, Error=XXXXXXXXXXXX=, StringToSignBytes=XXXXXXXXX} 

Quand ne fournissant pas le point final comme ci-dessus, je reçois une autre erreur: The bucket you are attempting to access must be addressed using the specified endpoint

Après avoir défini le point final, j'ai essayé plusieurs façons de passer le « seau » paramètre à listObjects, qui n'a pas fonctionné.

Vous ne savez pas pourquoi la signature générée en arrière-plan est incorrecte. Des idées?

+1

Vérifiez l'heure sur votre système (utilisé pour générer la demande) et vérifiez vos informations d'identification. – cchantep

+0

Un bon point de départ pour déboguer le problème est http://docs.aws.amazon.com/general/latest/gr/signature -v4-troubleshooting.html – FtoTheZ

+0

@cchantep Comment déterminez-vous le "bon" moment? Généralement, la même chose fonctionne en utilisant l'AWS CLI * sur la même machine * où le processus de création de signature utilise le même temps. –

Répondre

0

Cette erreur signifie généralement que les informations d'identification ne sont pas correctes.

val credentials = new com.amazonaws.auth.BasicAWSCredentials(
    "ACCESS_KEY_ID", 
    "SECRET_ACCESS_KEY" 
) 

Utilisez-vous la clé d'accès et la clé secrète actuelles dans votre code? Est-ce qu'ils correspondent aux valeurs dans votre fichier ~/.aws/credentials?

Vous pouvez essayer de créer le AmazonS3Client sans fournir explicitement des informations d'identification à l'aide du constructeur par défaut. Le comportement par défaut consiste à utiliser les valeurs dans ~/.aws/credentials tout comme la CLI. Pour exclure les problèmes d'informations d'identification, vous pouvez activer la journalisation dans l'interface de ligne de commande et la comparer avec les journaux du kit de développement logiciel (SDK). Essayez:

aws --debug s3 ls s3://somebucket/foo/bar 

Vous devriez voir quelque chose comme ceci:

... 
2016-01-06 13:29:01,306 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: env 
2016-01-06 13:29:01,306 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: assume-role 
2016-01-06 13:29:01,306 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: shared-credentials-file 
2016-01-06 13:29:01,306 - MainThread - botocore.credentials - INFO - Found credentials in shared credentials file: ~/.aws/credentials 
... 

Ensuite, activer la journalisation du SDK comme indiqué ici: http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-logging.html. Vous devez simplement fournir le fichier log4j jar et le fichier exemple log4j.properties.

Vous devriez voir ceci:

... 
2016-01-06 13:26:47,621 [main] DEBUG com.amazonaws.auth.AWSCredentialsProviderChain - Unable to load credentials from EnvironmentVariableCredentialsProvider: Unable to load AWS credentials from environment variables (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY)) 
2016-01-06 13:26:47,621 [main] DEBUG com.amazonaws.auth.AWSCredentialsProviderChain - Unable to load credentials from SystemPropertiesCredentialsProvider: Unable to load AWS credentials from Java system properties (aws.accessKeyId and aws.secretKey) 
2016-01-06 13:26:47,636 [main] DEBUG com.amazonaws.auth.AWSCredentialsProviderChain - Loading credentials from [email protected] 
... 

Si cela se révèle pas être le problème, vous pouvez examiner les journaux en détail pour diagnostiquer le problème.

+0

Salut, merci pour la réponse. Oui, dans le code j'utilise les informations d'identification réelles. L'utilisation des informations d'identification CLI et pas d'informations d'identification (dans le code) déclenche la même exception. –