【发布时间】:2015-08-11 16:33:13
【问题描述】:
我已经在网上搜索了两天多,可能已经浏览了大多数在线记录的场景和解决方法,但到目前为止对我没有任何帮助。
我在 AWS SDK 上运行在 PHP 5.3 上的 PHP V2.8.7。
我正在尝试使用以下代码连接到我的 Amazon 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文件如下:
return [
// Bootstrap the configuration file with AWS specific features
'includes' => ['_aws'],
'services' => [
// 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' => [
'params' => [
'credentials' => [
'key' => 'key',
'secret' => 'secret'
]
]
]
]
];
它正在产生以下错误:
我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
我已经检查了我的访问密钥和秘密至少 20 次,生成了新的,使用不同的方法来传递信息(即配置文件和在代码中包含凭据),但目前没有任何工作。
【问题讨论】:
-
所以,AWS SDK 只是实现了一堆直接的 API 调用。使用 AWS,您进行的每一次调用都会使用您的私钥(或上面的
secret),并使用它来根据您的访问密钥、当前时间戳以及许多其他因素来计算签名。见docs.aws.amazon.com/general/latest/gr/…。这是一个远景,但考虑到它们包括时间戳,也许您本地环境的时间已经关闭? -
当我们在对象元数据中传递了不正确的大小 (
Content-Length) 时发生。 (长版:我们直接将输入流从 JavaHttpServletRequest传递到 S3 客户端,并通过元数据将request.getContentLength()作为Content-Length传递;当 servlet(随机)接收分块请求时(Transfer-Encoding: chunked) ,getContentLength()正在返回-1- 这导致putObject失败(随机)。晦涩难懂;但显然是我们的错,因为我们传递了不正确的对象大小。) -
乔什我的笔记本电脑时间是一个小时(出于某种原因,它被设置为莫斯科而不是伦敦时间)。感谢您的帮助!
-
第一次访问,请浏览很多答案,在很多情况下您会收到此错误以及此页面中给出的各种解决方案
-
就我而言,对于 opensearch,我在路径和 URL 中给出了不同的信息...
标签: php amazon-web-services amazon-s3 aws-php-sdk