数字海洋空间 - 预签名URL(签名V2)

时间:2017-10-21 23:17:31

标签: php amazon-web-services amazon-s3 hash digital-ocean

我不确定您是否了解DigitalOcean的新Spaces,这是一个像S3一样的K / V对象存储。事实上,他们甚至使它与S3 API兼容 - 除了一个主要问题。他们现在只允许V2签名。

在此之后:https://developers.digitalocean.com/documentation/spaces/?utm_medium=email&utm_source=local&utm_campaign=ObjectStorageEA#authentication

我想出了我认为可行的方法,但事实并非如此。

有人可以指出我正确的方向吗?似乎没有人在任何地方站出来说他们知道如何使用V2签名。

谢谢!

     function generateSignature($a) { 

        $awsKeyId = 'KEY_ID';                       
        $awsSecret = 'SECRET_KEY';                       
        $expires = time() + (5*60);                   
        $httpVerb = "GET"; 
        $contentMD5 = ""; 
        $contentType = ""; 
        $amzHeaders = ""; 
        $amzResource = "/" . $a; 

    $str = "AWS2-HMAC-SHA1"."\n" . 
            date(DateTime::ISO8601) . "\n" . 
            date('Ymd') . "/nyc3.digitaloceanspaces.com/s3/aws2_request" . "\n" . 
            base64_encode(sha1()); 

    $dateKey = hash_hmac("sha1",$awsSecret,date("Ymd")); 

    $dateRegionKey = sha1($dateKey,"nyc3.digitaloceanspaces.com"); 
    $dateRegionServiceKey = sha1($dateRegionKey,"s3"); 
    $signingKey = sha1($dateRegionServiceKey."aws2_request"); 
    $signature = base64_encode(hash_hmac('sha1',$str,$signingKey)); 

    $url = "https://repo-name.nyc3.digitaloceanspaces.com%s?AWSAccessKeyId=%s&Expires=%s&Signature=%s"; 
    $presignedUrl = sprintf( $url , $amzResource , $awsKeyId , $expires , $signature ); 

    return $presignedUrl; 

}

2 个答案:

答案 0 :(得分:0)

从这一行开始......

$str = "AWS2-HMAC-SHA1"."\n"

...你在那里拥有的一切,以下实际上只是签名版本4,只有一些变化。这些都不是你需要的。

签名版本2有很大不同。没有级联的日期/地区/服务/签名密钥。您只需获取规范请求并使用密钥进行HMAC签名,然后使用base64结果。然后你url-escape签名,以获得+ / =的正确的百分比编码等价物。 (剧透警报:跳过最后一步将为您提供大约50/50的工作和非工作签名URL组合。)

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth处的V2文档开始,然后按照上一节中未提及的内容返回页面。

答案 1 :(得分:0)

  

他们现在只允许V2签名。

事实并非如此。我正在使用带空格的v4签名。

您应该使用AWS SDK,而不是重新发明所有这些内容。 http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html#endpoint