AWS S3 - 'Hesapladığımız istek imzası imzayla eşleşmiyor' hatası nasıl düzeltilir?


95

İki günden fazla bir süredir web'de arama yaptım ve muhtemelen çevrimiçi belgelenmiş senaryoların ve çözümlerin çoğunu inceledim, ancak şimdiye kadar hiçbir şey benim için işe yaramadı.

Ben duyuyorum AWS SDK PHP V2.8.7 PHP 5.3 üzerinde çalışan için.

S3 klasörüme aşağıdaki kodla bağlanmaya çalışıyorum:

// 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 dosyam aşağıdaki gibidir:

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

Aşağıdaki hatayı üretiyor:

Hesapladığımız istek imzası, sağladığınız imzayla eşleşmiyor. Anahtarınızı ve imzalama yönteminizi kontrol edin.

Erişim anahtarımı ve sırrımı en az 20 kez kontrol ettim, yenilerini oluşturdum, bilgileri aktarmak için farklı yöntemler kullandım (yani profil ve kodda kimlik bilgileri dahil) ancak şu anda hiçbir şey çalışmıyor.


3
Dolayısıyla, AWS SDK yalnızca bir dizi doğrudan API çağrısı gerçekleştirir. AWS ile yaptığınız her arama özel anahtarınızı (veya secretüstünü) alır ve bunu erişim anahtarınıza, geçerli zaman damgasına ve bir dizi başka faktöre göre bir imza hesaplamak için kullanır. Docs.aws.amazon.com/general/latest/gr/… adresine bakın . Bu uzun bir görüntü, ancak zaman damgasını içerdikleri göz önüne alındığında, belki de yerel ortamınızın zamanı kapalı?
Josh Padnick

Content-LengthNesne meta verilerinde yanlış bir boyut ( ) geçtiğimizde oldu . (Uzun versiyon: girdi akışını bir Java'dan HttpServletRequestS3 istemcisine doğrudan aktarıyorduk ve meta veri yoluyla request.getContentLength()olduğu gibi Content-Lengthaktarıyorduk; sunucu uygulaması (rastgele) yığınlanmış istekleri alırken ( Transfer-Encoding: chunked) getContentLength()geri dönüyordu -1- bu putObjectda başarısız olmasına (rastgele) yol açtı . Belirsiz; ama açıkça bizim hatamız çünkü yanlış bir nesne boyutunu geçiyorduk.)
Janaka Bandara

Josh dizüstü bilgisayarımın zamanı bir saat gecikti (nedense Londra saatine değil Moskova'ya ayarlandı). Yardım için teşekkürler!
Ross Symonds

Yanıtlar:


83

İki günlük hata ayıklamadan sonra, sonunda sorunu keşfettim ...

Nesneye atadığım anahtar bir nokta ile başladı, yani ..\images\ABC.jpgbu hatanın oluşmasına neden oldu.

API'nin daha anlamlı ve alakalı hata mesajı vermesini diliyorum, umarım bu başka birine yardımcı olur!


Durum paketim vardı ve anahtar geriye doğru ve aldığınız hata bu (imza eşleşmiyor). Wtf terraform?
Lo-Tan

17
Önde gelen bir eğik çizgi de benim için bu soruna neden oldu. Dosyaya / yoluna / dosyaya değil, yalnızca / yoluna / dosyaya ihtiyacınız var
Graham

4
Ve benim için sorun anahtarın içindeki beyaz boşluklardı
Adam Szmyd

4
Buna eklemek için, +anahtarımda artı işareti varken bu hata mesajını alıyordum .
LCC

2
Bunu, Content-Typeyükleme dosyası
isteğimde

37

Bu hatayı yanlış kimlik bilgileriyle alıyorum. Orijinal olarak yapıştırdığımda görünmez karakterler olduğunu düşünüyorum.


3
Basitçe dobuble-tıkladım key_hash_lala/key_hash_continuesve sadece bir bölüm seçtim . Ne yazık ki, kullanıcıya "yanlış şifre, ahbap!" Demek ne kadar zor?
Ufos

İlk kez anahtarı indirilebilir csv'den kopyalarken sorun yaşadım. Oluşturduğum ikinci anahtar için, onu tarayıcıdan kopyaladım ve herhangi bir sorun
yaşamadım

+1 - @ nthaxis - .csv'den kopyalamak bir hataya neden oldu - doğrudan tarayıcıdan kopyalamak bir tedavi işe yarıyor
NKCampbell

15

Bazı UTF8 karakterleri olan bir nesneyi kopyalamaya çalışırken aynı sorunu yaşadım. Aşağıda bir JS örneği verilmiştir:

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 ile kodlanarak çözüldü encodeURIComponent()


11

Bu hata, çoğunlukla gizli anahtarınızdan önce veya sonra bir boşluk varsa ortaya çıkıyor.


bu tam yardım
Mr S Coder

Aynı sorun vardı. Skype bazen değerleri boş satırlarla kopyalar. Not defterine yapıştırın ve ardından boşluklar olmadan kopyalayın.
michal-michalak

Evet ! Başka başlıklarda boşluk olup olmadığını da kontrol edin.
Eino Gourdin

6

Aslında Java'da da aynı hatayı alıyordum. 4 saat boyunca hata ayıklamak için harcadıktan sonra, sorunun S3 Objects'teki meta verilerde olduğunu buldum çünkü s3 dosyalarında önbellek kontrolleri otururken alan vardı. 1.6'da bu alana izin verildi. ancak 1.11. * sürümünde buna izin verilmiyor ve bu nedenle imza uyuşmazlığı hatası veriyordu


Content-LengthMeta
veride

4

Benim için aksiyolar kullandım ve sağır olarak başlık gönderiyor

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

bu yüzden göndermek için değiştiriyorum:

content-type: application/octet-stream

ve ayrıca bu Content-Type'ı AWS imzasına eklemek zorunda kaldı

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

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

3

Bahsedilen diğer çözümlerden hiçbiri sizin için işe yaramazsa, kullanmayı deneyin.

aws configure

bu komut , anahtarlar, bölge ve çıktı biçimini soran bir dizi seçenek açacaktır.

Bu yardımcı olur umarım!


3

Aws-php-sdk'nin önceki bir sürümünde, S3Client::factory()yöntemin kullanımdan kaldırılmasından önce , dosya yolunun bir kısmını veya parametrelerdeKey çağrıldığı şekliyle paket parametresine yerleştirmenize izin veriliyordu . Üretim kullanımında v2 SDK kullanan bir dosya yöneticim vardı. Fabrika yöntemi hala çalıştığından, güncellemesinden sonra bu modülü tekrar ziyaret etmedim . Bugün, neden bu hatayı almaya başladığımı hata ayıklamak için iki saatin daha iyi bir kısmını harcadım ve bu, geçtiğim parametrelerden (eskiden çalışıyordu) kaynaklandı:S3Client->putObject()~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'
]);

catsinhatsPaket / anahtar yolumun bir kısmını Keyparametreye taşımak zorunda kaldım , şöyle ki:

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

Bunun olduğuna inandığım şey, Bucketadın artık URL Kodlu olması. SDK'dan aldığım mesajı tam olarak inceledikten sonra şunu buldum:

PutObjectÜzerinde yürütme hatasıhttps://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png

AWS HTTP hatası: İstemci hatası: PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.pnga sonuçlandı403 Forbidden

Bu, /parametime sağladığımın Bucketgeçtiğini urlencode()ve şimdi olduğunu gösteriyor %2F.

İmzanın çalışma şekli oldukça karmaşıktır, ancak sorun pakete kadar uzanır ve şifreli imzayı oluşturmak için anahtar kullanılır. Hem arayan istemcide hem de AWS içinde tam olarak eşleşmiyorlarsa, istek bir 403 ile reddedilecektir. Hata mesajı aslında soruna işaret ediyor:

Hesapladığımız istek imzası, sağladığınız imzayla eşleşmiyor. Anahtarınızı ve imzalama yönteminizi kontrol edin.

Yani, Keyyanılmışım çünkü Bucketyanılmışım.


3

Nodejs'de de aynı hatayı yaşadım. Ama signatureVersions3 kurucusunu eklemek bana yardımcı oldu:

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

Ben buna rastlamadan önce birçok şey denedim! Bu benim için cevaptı.
DavidG

3

Benim durumumda kullanmam s3.getSignedUrl('getObject')gerektiğinde kullanıyordum s3.getSignedUrl('putObject')(çünkü dosyamı yüklemek için bir PUT kullanıyorum), bu yüzden imzalar eşleşmedi.


Uzun saatler sonra beni kurtardın. Teşekkür ederim!!
Kisinga


2

Bunu, React Native ile AWS SDK kullanarak S3'e bir görüntü yüklerken deneyimledim. ContentEncodingParametreden kaynaklandığı ortaya çıktı .

Bu parametrenin kaldırılması sorunu "çözdü".


2

Ben de aynı sorunu yaşadım. Varsayılan yönteme sahiptim, PUT önceden imzalanmış URL'yi tanımlamak için ayarlandı, ancak bir GET gerçekleştirmeye çalışıyordu. Hata, yöntem uyumsuzluğundan kaynaklanıyordu.


Bu benim için çalıştı. İmzalanmış URL'yi oluşturmak için kullanılan HTTP fiili (PUT, POST), bu URL ile bir yükleme gerçekleştirirken kullanılan fiil ile aynı olmalıdır.
craigcaulfield

1

Benzer bir hatayla karşılaştım, ancak bana göre, iki farklı Elastic Beanstalk ortamında S3 ile çalışmak için bir IAM kullanıcısını yeniden kullanmaktan kaynaklanıyordu. Belirtiyi, her ortam için aynı şekilde izin verilen bir IAM kullanıcısı oluşturarak tedavi ettim ve bu da hatanın ortadan kalkmasına neden oldu.


1

Benim durumumda bir S3 url'sini bileşenlerine ayrıştırdım.

Örneğin:

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

Şu şekilde ayrıştırıldı:

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

Önde gelen '/' içeren yol kısmına sahip olmak istek başarısız oldu.


1

Diğer bir olası sorun, meta değerlerin US-ASCII olmayan karakterler içermesi olabilir. Benim için değerleri putRequest'e eklerken UrlEncode'a yardımcı oldu:

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

1

AWS s3 paketimdeki genel izinleri değiştirerek ve klasör ayarlarıma aşağıdaki CORS yapılandırmasını ekleyerek bu sorunu çözdüm.

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

Daha fazla bilgi için AWS s3 belgelerine bakın .


1

Çoğu zaman yanlış anahtar (AWS_SECRET_ACCESS_KEY) nedeniyle olur. Lütfen AWS_SECRET_ACCESS_KEY'inizi çapraz doğrulayın. Umarım işe yarar ...


1

Bir nesneyi kopyalamaya çalışırken bu hatayı aldım. CopySource'u kodlayarak düzelttim. Bu aslında yöntem belgelerinde açıklanmaktadır:

Parametreler: copySource - Eğik çizgiyle (/) ayrılmış olarak kaynak paketinin adı ve kaynak nesnenin anahtar adı. URL kodlamalı olmalıdır.

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

1

Benim durumumda, AWS imza Yetkilendirme yönteminde postacı kullanarak istekte bulunurken hizmet adı olarak S3 (büyük harf) kullanıyordum


AWS Sign'ı nereye yerleştireceğiniz konusunda daha fazla ayrıntı ekleyebilir misiniz?
Mr S Coder

1

Hata ayıkladıktan ve çok zaman harcadıktan sonra, benim durumumda, sorun access_key_id ve secret_access_key ile ilgiliydi, kimlik bilgilerinizi iki kez kontrol edin veya mümkünse yenisini oluşturun ve kimlik bilgilerini paramlarda geçirdiğinizden emin olun.


Yukarıdaki cevabı okuduğumda gizli anahtarımı iki kez kontrol ettim ve sonunda / eklediğimi fark ettim.
Ezrqn Kemboi

0

Benim durumumda paket adı yanlıştı, anahtarın ilk bölümünü içeriyordu (buckxxx / keyxxx) - imzada yanlış bir şey yoktu.


0

Benim durumumda (python) başarısız oldu çünkü dosyada bu iki kod satırı vardı, eski bir koddan miras alındı

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


0

Bununla en son sürümü kullanırken AWS S3 olmayan bir uç noktayla bir Docker görüntüsünde karşılaştım awscliDebian streç için mevcut olan sürümü, yani 1.11.13 sürümünü .

CLI 1.16.84 sürümüne yükseltme sorunu çözdü.

CLI'nin en son sürümünü Debian streç görüntüsüne dayalı bir Dockerfile ile yüklemek için, bunun yerine:

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

Kullanım:

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

0

Ayarlamak zorundaydım

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

Ruby aws sdk v2 ile daha önce (muhtemelen diğer dillerde de buna benzer bir şey vardır)


0

Çıktı URL'yi tarayıcıda test etmeye çalışırken herhangi birinin bu soruna gelip gelmediğini bilmiyorum, ancak Postmanoluşturulan AWS URL'sini kullanıyorsanız ve kopyalamaya çalışıyorsanızRAW sekmeden , ters eğik çizgilerden kaçmak nedeniyle yukarıdaki hatayı alacaksınız. .

PrettyGerçekten çalışıp çalışmadığını görmek için URL'yi kopyalayıp yapıştırmak için sekmeyi kullanın .

Son zamanlarda bu sorunla karşılaştım ve bu çözüm sorunumu çözdü. Verileri url aracılığıyla gerçekten alıp almadığınızı görmek test amaçlıdır.

Bu cevap, AWS'den bir indirme, geçici bağlantı oluşturmaya veya genellikle kullanmak üzere AWS'den bir URL oluşturmaya çalışanlara bir referanstır.


0

Benim durumumdaki sorun, Amplify'yi yapılandırmak için kullanılan ve sonunda fazladan bir eğik çizgi olan API Ağ Geçidi URL'siydi ...

Sorgulanan url benziyordu https://....amazonaws.com/myapi//myendpoint. Conf'teki ekstra eğik çizgiyi kaldırdım ve işe yaradı.

Hayatımın en açık hata mesajı değil.


0

Benim durumumda s3request.promise().then()yanlışlığı arıyordum , bu da sadece bir arama yapıldığında talebin iki kez yürütülmesine neden oldu.

Demek istediğim, 6 nesneyi yineliyordum ancak 12 istek yapıldı (konsola giriş yaparak veya tarayıcıda ağda hata ayıklayarak kontrol edebilirsiniz)

İstenmeyen ikinci talebin zaman damgası, bu soruna neden olan ilk kişinin imzasıyla eşleşmediğinden.


0

Java SDK aracılığıyla CloudSearch'e belge yüklerken bu hatayı aldım. Sorun, yüklenecek belgedeki özel bir karakterden kaynaklanıyordu. "Hesapladığımız istek imzası, sağladığınız imzayla eşleşmiyor. AWS Gizli Erişim Anahtarınızı ve imzalama yönteminizi kontrol edin." çok yanıltıcıdır.


0

yeni bir erişim anahtarı oluşturmak benim için çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.