如何使用PHP为Amazon EC2生成v2签名?

时间:2009-04-08 00:01:06

标签: php amazon-ec2

我想知道是否有人使用php为他们的API成功生成了EC2 v2签名。我可以在网上找到的所有示例/库都是签名的v1,并且由于不安全因素而被弃用。实现签名生成的现有库也将受到赞赏。

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

Here's支持V2的PHP库。我没试过。

答案 2 :(得分:0)

以下是我编写并使用过的一些代码:

define("AWSKEY", "Your AWS Key");
define("AWSSECRET", "Your AWS Secret");
public function get($parameters, $host) {

    // Build out the variables
    $domain = "https://$host/";
    $parameters['AWSAccessKeyId'] = AWSKEY;
    $parameters['Timestamp'] = date('c');
    $parameters['Version'] = '2007-11-07';
    $parameters['SignatureMethod'] = 'HmacSHA256';
    $parameters['SignatureVersion'] = 2;

    // Write the signature
    $signature = "GET\n";
    $signature .= "$host\n";
    $signature .= "/\n";

    $sigparams = $parameters;

    ksort($sigparams);

    $first = true;
    foreach($sigparams as $key=>$param) {
        $signature .= (!$first ? '&' : '') . rawurlencode($key) . '=' . rawurlencode($param);
        $first = false;
    }
    $signature = hash_hmac('sha256', $signature, $AWSKEY, true);
    $signature = base64_encode($signature);
    $parameters['Signature'] = $signature;

    $url = $domain . '?';
    $first = true;
    foreach($parameters as $key=>$param) {
        $url .= (!$first ? '&' : '') . rawurlencode($key) . '=' . rawurlencode($param);
        $first = false;
    }

    $ch = curl_init(trim($url));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $output = curl_exec($ch);

    return $output;

}

以下是您使用它的方式:

$params = array(
    'Action' => 'ListDomains'
);
$db->get($params, 'sdb.amazonaws.com');

这将在SimpleDB上执行ListDomains查询。该函数本身将返回Amazon的输出。对于更复杂的命令(即:PUT,POST等),不需要进行任何重大修改。

答案 3 :(得分:0)

使用常量AWSSECRET来散列签名,NOT $ AWSKEY(一个未引用的变量)。