AWS S3 - हमारे द्वारा की गई अनुरोध हस्ताक्षर को कैसे ठीक किया जाए, यह हस्ताक्षर की त्रुटि से मेल नहीं खाता है?


97

मैंने अब दो दिनों के लिए वेब पर खोज की है, और संभवत: अधिकांश ऑनलाइन दस्तावेज़ परिदृश्यों और वर्कअराउंड के माध्यम से देखा है, लेकिन अभी तक मेरे लिए कुछ भी काम नहीं किया है।

मैं PHP V2.8.7 के लिए AWS SDK पर हूँ, जो PHP 5.3 पर चल रहा है।

मैं निम्नलिखित कोड के साथ अपने S3 बाल्टी से कनेक्ट करने का प्रयास कर रहा हूं:

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

मेरी config.php फ़ाइल इस प्रकार है:

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

यह निम्नलिखित त्रुटि उत्पन्न कर रहा है:

हमारे द्वारा की गई अनुरोध हस्ताक्षर आपके द्वारा प्रदत्त हस्ताक्षर से मेल नहीं खाती है। अपनी कुंजी और हस्ताक्षर विधि की जाँच करें।

मैंने पहले से ही अपनी पहुंच कुंजी और गुप्त को कम से कम 20 बार जांचा है, नए लोगों को उत्पन्न किया, जानकारी में पास करने के लिए विभिन्न तरीकों का इस्तेमाल किया (यानी प्रोफ़ाइल और कोड में क्रेडेंशियल्स सहित), लेकिन फिलहाल कुछ भी काम नहीं कर रहा है।


3
इसलिए, एडब्ल्यूएस एसडीके सीधे एपीआई कॉल का एक गुच्छा लागू करता है। AWS के साथ, आपके द्वारा किया जाने वाला हर एक कॉल आपकी निजी कुंजी (या secretऊपर) लेता है , और इसका उपयोग आपकी पहुंच कुंजी, वर्तमान टाइमस्टैम्प, और अन्य कारकों के एक समूह के आधार पर एक हस्ताक्षर की गणना करने के लिए करता है। Docs.aws.amazon.com/general/latest/gr/… देखें । यह एक लंबी बात है, लेकिन यह देखते हुए कि वे टाइमस्टैम्प को शामिल करते हैं, शायद आपके स्थानीय पर्यावरण का समय बंद है?
जोश पैडिक

तब हुआ जब हमने Content-Lengthऑब्जेक्ट मेटाडेटा में एक गलत आकार ( ) पास किया था । (लांग संस्करण: हम सीधे एक जावा से इनपुट धारा गुजर रहे थे HttpServletRequestS3 ग्राहक के लिए, और में गुजर request.getContentLength()के रूप में Content-Lengthमेटाडाटा के माध्यम से, जब सर्वलेट था (अनियमित) chunked प्राप्त अनुरोध ( Transfer-Encoding: chunked), getContentLength()लौटने था -1- जो नेतृत्व putObjectविफल (अनियमित)। अस्पष्ट; लेकिन स्पष्ट रूप से हमारी गलती है क्योंकि हम एक गलत वस्तु के आकार से गुजर रहे थे।)
जनक बंडारा

जोश मेरे लैपटॉप का समय एक घंटे का था (किसी कारण से यह मॉस्को और लंदन के समय के लिए सेट किया गया था)। सहायता के लिए धनयवाद!
रॉस साइमंड्स

जवाबों:


83

डिबगिंग के दो दिनों के बाद, मुझे आखिरकार समस्या का पता चला ...

जिस कुंजी को मैं ऑब्जेक्ट पर नियत कर रहा था, वह एक अवधि के साथ शुरू हुई थी ..\images\ABC.jpg, और इस कारण त्रुटि हुई।

मुझे लगता है कि एपीआई अधिक सार्थक और प्रासंगिक त्रुटि संदेश प्रदान करता है, अफसोस, मुझे आशा है कि यह किसी और को वहां से बाहर निकालने में मदद करेगा!


मेरे पास स्टेट बकेट और चाबी पीछे की ओर थी और यह आपको मिलने वाली त्रुटि है (हस्ताक्षर मेल नहीं खाता)। Wtf भूनिर्माण?
लो-टैन

17
एक प्रमुख स्लैश ने भी मेरे लिए इस मुद्दे का कारण बना। आपको बस पथ / / / फ़ाइल की आवश्यकता है, / पथ / / to फ़ाइल की नहीं
ग्राहम

4
और मेरे लिए यह मुद्दा कुंजी के अंदर सफेद स्थान था
एडम स्ज़माइड

4
इसे जोड़ने के लिए, मुझे +अपनी कुंजी में प्लस चिह्न होने पर यह त्रुटि संदेश मिल रहा था ।
LCC

2
मुझे यह तब मिल रहा था जब मैंने Content-Typeअपने अपलोड फ़ाइल अनुरोध में हेडर नहीं दिया था
एंजेल वेन्चेव

38

मुझे गलत क्रेडेंशियल्स के साथ यह त्रुटि मिलती है। मुझे लगता है कि जब मैंने इसे मूल रूप से चिपकाया था तो अदृश्य पात्र थे।


3
मैं बस पर घुलनशील क्लिक किया key_hash_lala/key_hash_continuesऔर यह केवल एक भाग का चयन किया। काश, उपयोगकर्ता को "गलत पासस्वर्ड, यार" बताना कितना कठिन है?
उफोस

पहली बार मेरे पास डाउनलोड करने योग्य सीएसवी से कुंजी को कॉपी करने के मुद्दे थे। मेरे द्वारा बनाई गई दूसरी कुंजी के लिए, मैंने इसे ब्राउज़र से कॉपी किया और कोई भी समस्या नहीं थी
nthaxis

+1 से @nthaxis - .csv से कॉपी करना विफलता का कारण बना - ब्राउज़र से सीधे कॉपी करना और यह एक ट्रीट काम करता है
NKCampbell

मेरे लिए, यह गलत साख का भी परिणाम था। मैंने अपनी साख में एक चरित्र को याद किया।
वादा

15

मुझे यही समस्या थी जब कुछ UTF8 वर्णों के साथ किसी ऑब्जेक्ट को कॉपी करने का प्रयास किया गया था। नीचे एक जेएस उदाहरण है:

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

CopySource के साथ एन्कोडिंग द्वारा हल किया गया encodeURIComponent()


12

यह त्रुटि तब होती है जब आपकी गुप्त कुंजी के पहले या बाद में कोई स्थान होता है


यह पूर्ण सहायता है
श्री एस कोडर

एक ही समस्या थी। Skype कभी-कभी रिक्त लाइनों के साथ मूल्यों की प्रतिलिपि बनाता है। बस इसे नोटपैड में पेस्ट करें और फिर इसे बिना व्हाट्सएप के कॉपी करें।
मिशाल-मिचलक

हाँ ! यह भी जांचें कि क्या आपके पास किसी अन्य हेडर में जगह है।
ईनो गौरडिन

6

वास्तव में जावा में मुझे एक ही त्रुटि मिल रही थी। इसे डिबग करने के लिए 4 घंटे बिताने के बाद मैंने पाया कि S3 ऑब्जेक्ट्स में मेटा डेटा में समस्या थी क्योंकि s3 फाइलों में कैशे कंट्रोल करते समय जगह थी। इस स्पेस को 1.6 में अनुमति दी गई थी। * संस्करण लेकिन १.११ में। * यह अस्वीकृत है और इस प्रकार हस्ताक्षर बेमेल त्रुटि फेंक रहा था


यदि आप Content-Lengthमेटाडेटा में एक गलत पास करते हैं, तो भी होता है
जनक बंडरा

4

मेरे लिए मैंने axios का उपयोग किया और बधिया करके यह शीर्ष लेख भेजता है

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

तो मैं भेजने के लिए बदल:

content-type: application/octet-stream

और इस सामग्री-प्रकार को AWS हस्ताक्षर में भी जोड़ना था

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

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

3

यदि कोई अन्य वर्णित समाधान आपके लिए काम नहीं करता है, तो उपयोग करने का प्रयास करें

aws configure

यह कमांड कुंजियों, क्षेत्र और आउटपुट प्रारूप के लिए पूछ रहे विकल्पों का एक समूह खोलेगा।

उम्मीद है की यह मदद करेगा!


3

Aws-php-sdk के पिछले संस्करण में, S3Client::factory()विधि के पदावनत करने से पहले , आपको फ़ाइल पथ का हिस्सा रखने की अनुमति दी गई थी, या Keyजैसा कि इसे S3Client->putObject()पैरामीटर में , बाल्टी पैरामीटर पर कहा जाता है । मेरे पास v2 एसडीके का उपयोग करते हुए, उत्पादन उपयोग में एक फ़ाइल प्रबंधक था। चूँकि फैक्ट्री मेथड अभी भी काम कर रहा है, मैंने अपडेट करने के बाद इस मॉड्यूल को दोबारा नहीं देखा ~3.70.0। आज मैंने दो घंटे डिबगिंग का बेहतर हिस्सा बिताया है कि मुझे यह त्रुटि क्यों शुरू हुई थी, और यह उन मापदंडों के कारण समाप्त हो गया था जो मैं गुजर रहा था (जो काम करता था):

$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'
]);

मुझे catsinhatsअपनी बाल्टी / कुंजी पथ के हिस्से को Keyपैरामीटर पर ले जाना था, जैसे:

$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'
]);

मेरा मानना ​​है कि यह हो रहा है कि Bucketनाम अब URL एनकोडेड हो रहा है । एसडीके से मुझे मिल रहे सटीक संदेश के और निरीक्षण के बाद, मैंने पाया:

त्रुटि को क्रियान्वित करने PutObjectपरhttps://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png

AWS HTTP एरर: क्लाइंट एरर: PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.pngपरिणामस्वरूप a403 Forbidden

इससे पता चलता है कि /मैंने अपने Bucketपैरामीटर को जो प्रदान किया है वह urlencode()अब तक है %2F

जिस तरह से सिग्नेचर काम करता है वह काफी जटिल है, लेकिन इस मुद्दे को बाल्टी में बदल दिया जाता है और एन्क्रिप्टेड हस्ताक्षर को उत्पन्न करने के लिए कुंजी का उपयोग किया जाता है। यदि वे दोनों कॉलिंग क्लाइंट पर और एडब्ल्यूएस के भीतर बिल्कुल मेल नहीं खाते हैं, तो अनुरोध को 403 के साथ अस्वीकार कर दिया जाएगा। त्रुटि संदेश वास्तव में इस मुद्दे को इंगित करता है:

हमारे द्वारा हस्ताक्षरित अनुरोध हस्ताक्षर आपके द्वारा प्रदत्त हस्ताक्षर से मेल नहीं खाता है। अपनी कुंजी और हस्ताक्षर विधि की जाँच करें।

इसलिए, मेरा Keyगलत था क्योंकि मेरा Bucketगलत था।


3

मुझे नोडज में वही त्रुटि थी। लेकिन signatureVersions3 कंस्ट्रक्टर में जोड़ने से मुझे मदद मिली:

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

इससे पहले कि मैं इस पर ठोकर खाई कई चीजों की कोशिश की! यह मेरे लिए जवाब था।
डेविडजी

3

मेरे मामले में मैं तब उपयोग कर रहा था s3.getSignedUrl('getObject')जब मुझे उपयोग करने की आवश्यकता थी s3.getSignedUrl('putObject')(क्योंकि मैं अपनी फ़ाइल अपलोड करने के लिए एक PUT का उपयोग कर रहा हूं), यही कारण है कि हस्ताक्षर मेल खाते हैं।


लंबे घंटों के बाद मुझे बचाया। धन्यवाद!!
किसिंग


2

मैंने अभी-अभी प्रतिक्रियाशील मूल निवासी AWS SDK का उपयोग करके S3 में एक छवि अपलोड करने का अनुभव किया। यह होने के कारण निकलाContentEncoding पैरामीटर के ।

उस पैरामीटर को हटाकर समस्या को "ठीक" कर दिया गया।


2

मेरी भी यही समस्या थी। मेरे पास डिफ़ॉल्ट विधि थी, पूर्व-हस्ताक्षरित URL को परिभाषित करने के लिए PUT सेट लेकिन एक GET प्रदर्शन करने का प्रयास कर रहा था। विधि बेमेल के कारण त्रुटि हुई थी।


इसने मेरे लिए काम किया। हस्ताक्षर किए गए URL को उत्पन्न करने के लिए उपयोग की जाने वाली HTTP क्रिया (PUT, POST) उस URL के साथ अपलोड करते समय उपयोग की जाने वाली क्रिया के समान होनी चाहिए।
क्रेगकुलफील्ड

1

मेरे पास एक समान त्रुटि थी, लेकिन मेरे लिए यह एक IAM उपयोगकर्ता को दो अलग-अलग इलास्टिक बीनस्टॉक वातावरण में S3 के साथ काम करने के लिए फिर से उपयोग करने के कारण हुआ। मैंने प्रत्येक वातावरण के लिए एक पहचान वाले IAM उपयोगकर्ता बनाकर लक्षण का इलाज किया और इससे त्रुटि दूर हो गई।


1

मेरे मामले में मैंने इसके घटकों में एक एस 3 यूआरएल डाला।

उदाहरण के लिए:

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

में पार्स किया गया था:

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

पथ के भाग में अग्रणी '' होने से अनुरोध विफल हो गया।


1

एक और संभावित मुद्दा यह हो सकता है कि मेटा वैल्यू में नॉन यूएस-एएससीआईआई अक्षर होते हैं। मेरे लिए यह उन मूल्यों को UrlEncode करने में मदद करता है जब उन्हें putRequest में जोड़ते हैं:

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

1

मैंने अपनी AWS s3 बाल्टी पर सार्वजनिक अनुमतियों को बदलकर और अपनी बाल्टी सेटिंग्स में CORS कॉन्फ़िगरेशन बेली जोड़कर इस समस्या को हल किया।

<?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>

अधिक infos के लिए AWS s3 प्रलेखन देखें ।


1

अधिकतर समय यह गलत कुंजी (AWS_SECRET_ACCESS_KEY) के कारण होता है। कृपया अपना AWS_SECRET_ACCESS_KEY सत्यापित करें। आशा है कि यह काम करेगा ...


1

किसी ऑब्जेक्ट को कॉपी करने का प्रयास करते समय मुझे यह त्रुटि मिली। मैंने इसे copySource को एन्कोडिंग करके ठीक किया। यह वास्तव में विधि प्रलेखन में वर्णित है:

Params: copySource - स्रोत बाल्टी का नाम और स्रोत ऑब्जेक्ट का मुख्य नाम, एक स्लैश (/) द्वारा अलग किया गया। URL-एन्कोडेड होना चाहिए।

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

1

मेरे मामले में, मैं S3 (अपरकेस) सेवा नाम के रूप में उपयोग कर रहा था, जब एडब्ल्यूएस हस्ताक्षर विवरणी पद्धति में डाकिया का उपयोग करके अनुरोध कर रहा था


क्या आप AWS साइन इन करने के लिए और अधिक विवरण जोड़ सकते हैं?
श्री एस कोडर

1

डिबगिंग और बहुत समय बिताने के बाद, मेरे मामले में, यह मुद्दा access_key_id और secret_access_key के साथ था, बस अपने क्रेडेंशियल्स की दोबारा जांच करें या यदि संभव हो तो नया उत्पन्न करें और सुनिश्चित करें कि आप params में क्रेडेंशियल्स पास कर रहे हैं।


जब मैंने उपरोक्त उत्तर पढ़ा, तो मैंने अपनी गुप्त कुंजी को दोबारा जांचा और महसूस किया कि मैंने अंत में जोड़ दिया है।
एज्रकन केम्बोइ

0

मेरे मामले में बकेटनेम गलत था, इसमें कुंजी (बकेटएक्सएक्सएक्स / कीएक्सएक्सएक्स) का पहला भाग शामिल था - हस्ताक्षर में कुछ भी गलत नहीं था।


0

मेरे मामले में (अजगर) यह विफल रहा क्योंकि मेरे पास फ़ाइल में कोड की ये दो लाइनें थीं, जो पुराने कोड से विरासत में मिली थी

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


0

मुझे एक डॉक छवि में इसका सामना करना पड़ा, गैर-एडब्ल्यूएस एस 3 समापन बिंदु के साथ, जब awscliडेबियन खिंचाव के लिए उपलब्ध नवीनतम संस्करण का उपयोग किया गया , अर्थात संस्करण 1.11.13।

सीएलआई संस्करण 1.16.84 में अपग्रेड करने से समस्या हल हो गई।

इसके बजाय एक डेबियन खिंचाव छवि के आधार पर एक डॉकरीफाइल के साथ सीएलआई के नवीनतम संस्करण को स्थापित करने के लिए:

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

उपयोग:

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

0

मुझे सेट करना पड़ा

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

माणिक aws sdk v2 के साथ पहले (अन्य भाषाओं में भी शायद कुछ ऐसा ही है)


0

मुझे नहीं पता कि ब्राउज़र में आउटपुट URL का परीक्षण करने का प्रयास करते समय कोई भी इस मुद्दे पर आया था, लेकिन यदि आप उपयोग कर रहे हैं Postmanऔर RAWटैब से AWS के उत्पन्न url को कॉपी करने का प्रयास कर रहे हैं , तो बैकस्लैश से बचने के कारण आपको उपरोक्त त्रुटि मिलने वाली है ।

PrettyUrl को कॉपी और पेस्ट करने के लिए टैब का उपयोग करके देखें कि क्या यह वास्तव में काम करता है।

मैं इस मुद्दे पर हाल ही में चला और इस समाधान से मेरी समस्या हल हो गई। यह परीक्षण प्रयोजनों के लिए है कि क्या आप वास्तव में यूआरएल के माध्यम से डेटा पुनर्प्राप्त करते हैं।

यह उत्तर उन लोगों के लिए एक संदर्भ है जो AWS से डाउनलोड, अस्थायी लिंक उत्पन्न करने का प्रयास करते हैं या आमतौर पर उपयोग करने के लिए AWS से URL उत्पन्न करते हैं।


0

मेरे मामले में मुद्दा एपीआई गेटवे URL था जिसका उपयोग एम्पलीफाय को कॉन्फ़िगर करने के लिए किया गया था जिसमें अंत में एक अतिरिक्त स्लैश था ...

झगड़ा हुआ url जैसा लग रहा था https://....amazonaws.com/myapi//myendpoint। मैंने कन्फेशन में अतिरिक्त स्लैश को हटा दिया और यह काम कर गया।

मेरे जीवन का सबसे स्पष्ट त्रुटि संदेश नहीं।


0

मेरे मामले में मैं अविवेकी कह रहा था s3request.promise().then()जिसके कारण अनुरोध के दो निष्पादन हो रहे थे जब केवल एक कॉल किया गया था।

मेरा मतलब है कि मैं 6 वस्तुओं के माध्यम से पुनरावृत्ति कर रहा था, लेकिन 12 अनुरोध किए गए थे (आप कंसोल में लॉग इन करके या ब्राउज़र में नेटवर्क को डिबग करके देख सकते हैं)

दूसरे, अवांछित, अनुरोध के लिए टाइमस्टैम्प के बाद से, एफआईआर के हस्ताक्षर से मेल नहीं खाते, जिससे यह मुद्दा पैदा हुआ।


0

जावा एसडीके के माध्यम से क्लाउडसर्च में दस्तावेज़ अपलोड करते समय यह त्रुटि हुई। दस्तावेज़ अपलोड करने के लिए एक विशेष वर्ण के कारण समस्या थी। त्रुटि "हमने जो अनुरोध हस्ताक्षर की गणना की वह आपके द्वारा प्रदत्त हस्ताक्षर से मेल नहीं खाता है। अपनी AWS सीक्रेट एक्सेस कुंजी और हस्ताक्षर विधि की जाँच करें।" बहुत भ्रामक है।


0

मेरे लिए काम की एक नई एक्सेस कुंजी बनाना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.