【问题标题】:How can I generate a v2 signature for Amazon EC2 using PHP?如何使用 PHP 为 Amazon EC2 生成 v2 签名?
【发布时间】:2013-03-12 18:13:58
【问题描述】:

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

【问题讨论】:

    标签: php amazon-ec2


    【解决方案1】:

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这是我编写并一直在使用的一些代码:

        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 等),无需进行任何重大修改。

        【讨论】:

          【解决方案4】:

          使用常量 AWSSECRET 对签名进行哈希处理,而不是 $AWSKEY(未引用的变量)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-07-21
            • 2012-03-24
            • 1970-01-01
            • 2011-03-27
            • 1970-01-01
            • 2019-07-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多