【发布时间】:2013-03-12 18:13:58
【问题描述】:
我想知道是否有人使用 php 为他们的 API 成功生成了 EC2 v2 签名。我可以在网上找到的所有示例/库都适用于签名的 v1,并且由于不安全而已被弃用。实现签名生成的现有库也将不胜感激。
【问题讨论】:
标签: php amazon-ec2
我想知道是否有人使用 php 为他们的 API 成功生成了 EC2 v2 签名。我可以在网上找到的所有示例/库都适用于签名的 v1,并且由于不安全而已被弃用。实现签名生成的现有库也将不胜感激。
【问题讨论】:
标签: php amazon-ec2
【讨论】:
Here's 一个支持 V2 的 PHP 库。不过我没试过。
【讨论】:
这是我编写并一直在使用的一些代码:
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 等),无需进行任何重大修改。
【讨论】:
使用常量 AWSSECRET 对签名进行哈希处理,而不是 $AWSKEY(未引用的变量)。
【讨论】: