2009-04-08 90 views
0

我想知道是否有人已經成功地爲他們的API使用php生成了EC2 v2簽名。我可以在網上找到的所有示例/庫都是用於簽名的v1版本,並且由於不安全因素已被棄用。實現簽名生成的現有庫也將受到讚賞。如何使用PHP爲Amazon EC2生成v2簽名?

回答

0

Here's一個支持V2的PHP庫。我還沒有嘗試過。

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等),不需要做任何重大修改。

0

使用常數AWSSECRET哈希簽名,而不是$ AWSKEY(未參考的變量)。