【发布时间】:2019-05-08 18:09:47
【问题描述】:
我的 PHP 应用程序使用了一组简单的函数上传到亚马逊 S3。 我的代码使用签名版本 2。一切正常。但它不适用于不支持签名 V2 的新区域。
我尝试实现签名 V4,但它看起来太复杂了。我只是无法为签名 V4 制作工作示例。
AWS SDK for PHP 支持 V4 登录。但这对我来说太复杂了。我不能使用那个 SDK(因为 PHP 5.2 我不能升级它)
在我当前的代码中,我有 V2 的简单代码
$stringToSign="PUT\n\n$contentType\n$httpDate\nx-amz-acl:$acl\n";
$stringToSign.="/$resource";
$signature = $this->constructSig($stringToSign);
$req->addHeader("Authorization", "AWS " . $this->accessKeyId . ":" . $signature);
function constructSig($str) {
$hasher = new Crypt_HMAC($this->secretKey, "sha1");
$signature = $this->hex2b64($hasher->hash($str));
return($signature);
}
有没有可能有这么简单的constructSigV4函数来创建新的签名类型?
另外,我明白了,新类型签名需要有桶区域。如果我不知道存储桶区域,那该怎么办?每次请求之前都请求存储桶区域?我在不同地区都有存储桶。
更新。
有简单的例子https://github.com/chrismeller/awstools/blob/master/aws/signature/v4.php
我似乎创建了工作示例。签名似乎通过了。我收到诸如“签名不匹配”之类的错误。然后我纠正直到这个错误消失。 但现在我有其他错误:
亚马逊的回应是:
HTTP/1.1 411 Length Required
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>MissingContentLength</Code><Message>You must provide the Content-Length HTTP header.</Message>
但是 Content-Length 包含在我的请求中
PUT /259001/checkmark-circle.png HTTP/1.1
Host: ******.s3.amazonaws.com
Content-Type: image/png
Content-Length: 2338
x-amz-acl: private
x-amz-content-sha256: STREAMING-AWS4-HMAC-SHA256-PAYLOAD
X-AMZ-Date: Tue, 19 Jan 2016 07:33:01 -0500
Date: Tue, 19 Jan 2016 07:33:01 -0500
Authorization: AWS4-HMAC-SHA256 Credential=************/20160119/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-acl;x-amz-content-sha256;x-amz-date,Signature=c2bb290f2d54d31bc95785705530e10e0a8bde4c7b7dd1ef3b11a8fa7d96a57c
有什么问题吗?为什么它说 Content-Length is missing if it is present?
【问题讨论】: