说明:当前页面接口为旧版 API,未来可能停止维护,目前不展示在左侧导航。云服务器 API 3.0 版本接口定义更加规范,访问时延下降显著,建议使用 云服务器 API 3.0。
腾讯云 API 会对每个访问请求进行身份验证,即每个请求都需要在公共请求参数中包含签名信息(Signature)以验证请求者身份。
签名信息由安全凭证生成,安全凭证包括 SecretId 和 SecretKey;若您还没有安全凭证,请前往 云 API 密钥页面 申请,否则无法调用云API接口。
1. 申请安全凭证
在第一次使用云API之前,请前往 云 API 密钥页面 申请安全凭证。
安全凭证包括 SecretId 和 SecretKey:
说明:SecretId 用于标识 API 调用者身份
SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。
您必须严格保管安全凭证,避免泄露。
申请安全凭证的具体步骤如下:
- 登录 腾讯云管理中心控制台。
- 前往 云 API 密钥 的控制台页面。
- 在云 API 密钥 页面,单击【新建密钥】即可以创建一对 SecretId/SecretKey。
说明:
开发商账号最多可以拥有两对 SecretId/SecretKey。
被开发商添加为子用户的 QQ 账号,在不同开发商控制台,可以申请不同的安全凭证。
子用户的安全凭证,目前仅可调用 CDN 的云 API。
2. 生成签名串
有了安全凭证 SecretId 和 SecretKey 后,就可以生成签名串了。以下是生成签名串的详细过程:
假设您的 SecretId 和 SecretKey 分别是:
- SecretId: ****
- SecretKey: Gu5t9xGARNpq86cd98joQYCN3**
注意:这里只是示例,请根据您实际申请的SecretId和SecretKey进行后续操作!
以 查看 CVM 实例列表 (DescribeInstances) 请求为例,当用户调用这一接口时,其请求参数可能如下:
参数名称 | 中文 | 参数值 |
---|---|---|
Action | 方法名 | DescribeInstances |
SecretId | 密钥Id | **** |
Timestamp | 当前时间戳 | 1465185768 |
Nonce | 随机正整数 | 11886 |
Region | 实例所在区域 | gz |
instanceIds.0 | 待查询的实例ID | ins-09dx96dg |
offset | 偏移量 | 0 |
limit | 最大允许输出 | 20 |
由上表可以看出,请求参数中的公共请求参数只有5个:Action、SecretId、Timestamp、Nonce和Region,而不是在“公共请求参数”中所述的6个,事实上,第6个参数Signature(签名串)正是由其他参数(包括指令请求参数)共同生成的,具体步骤如下:
2.1. 对参数排序
首先对所有请求参数按参数名做字典序升序排列,所谓字典序升序排列,直观上就如同在字典中排列单词一样排序,按照字母表或数字表里递增顺序的排列次序,即先考虑第一个“字母”,在相同的情况下考虑第二个“字母”,依此类推。您可以借助编程语言中的相关排序函数来实现这一功能,如PHP中的ksort函数。上述示例参数的排序结果如下:
{
'Action' : 'DescribeInstances',
'Nonce' : 11886,
'Region' : 'gz',
'SecretId' : '************************************',
'Timestamp' : 1465185768,
'instanceIds.0' : 'ins-09dx96dg',
'limit' : 20,
'offset' : 0
}
使用其它程序设计语言开发时, 可对上面示例中的参数进行排序,得到的结果一致即可。
2.2. 拼接请求字符串
此步骤生成请求字符串。
将把上一步排序好的请求参数格式化成“参数名称”=“参数值”的形式,如对Action参数,其参数名称为"Action",参数值为"DescribeInstances",因此格式化后就为Action=DescribeInstances。
注意:
- “参数值”为原始值而非url编码后的值。
- 若输入参数中包含下划线,则需要将其转换为“.”。
然后将格式化后的各个参数用"&"拼接在一起,最终生成的请求字符串为:
Action=DescribeInstances&Nonce=11886&Region=gz&SecretId=***********************************&Timestamp=1465185768&instanceIds.0=ins-09dx96dg&limit=20&offset=0
2.3. 拼接签名原文字符串
此步骤生成签名原文字符串。
签名原文字符串由以下几个参数构成:
- 请求方法:支持 POST 和 GET 方式, 这里使用 GET 请求, 注意方法为全大写。
- 请求主机:查看实例列表 (DescribeInstances) 的请求域名为:cvm.api.qcloud.com。实际的请求域名根据接口所属模块的不同而不同, 详见各接口说明。
- 请求路径:云 API 的请求路径固定为
/v2/index.php
。 - 请求字符串:即上一步生成的请求字符串。
签名原文串的拼接规则为:请求方法 + 请求主机 +请求路径 + ? + 请求字符串
示例的拼接结果为:
GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=11886&Region=gz&SecretId=***********************************A&Timestamp=1465185768&instanceIds.0=ins-09dx96dg&limit=20&offset=0
2.4. 生成签名串
此步骤生成签名串。
首先使用 HMAC-SHA1 算法对上一步中获得的签名原文字符串进行签名,然后将生成的签名串使用 Base64 进行编码,即可获得最终的签名串。
具体代码如下,以 PHP 语言为例:
$secretKey = '***********************';
$srcStr = 'GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=11886&Region=gz&SecretId=************************************&Timestamp=1465185768&instanceIds.0=ins-09dx96dg&limit=20&offset=0';
$signStr = base64_encode(hash_hmac('sha1', $srcStr, $secretKey, true));
echo $signStr;
最终得到的签名串为:
NSI3UqqD99b/UJb4tbG/xZpRW64=
使用其它程序设计语言开发时, 可用上面示例中的原文进行签名验证, 得到的签名串与例子中的一致即可。
3. 签名串编码
生成的签名串并不能直接作为请求参数,需要对其进行 URL 编码。
注意:如果用户的请求方法是 GET,则对所有请求参数值均需要做URL编码。
如上一步生成的签名串为 NSI3UqqD99b/UJb4tbG/xZpRW64=
,则其编码后为NSI3UqqD99b%2FUJb4tbG%2FxZpRW64%3D
。因此,最终得到的签名串请求参数 (Signature) 为:NSI3UqqD99b%2FUJb4tbG%2FxZpRW64%3D
,它将用于生成最终的请求 URL。
4. 鉴权失败
根据实际情况,存在以下鉴权失败的错误码,请根据实际情况处理
错误代码 | 错误类型 | 错误描述 |
---|---|---|
4100 | 鉴权失败 | 无效密钥或者密钥被禁用 |
4101 | 鉴权失败 | 该 SecretID 未被授权调用此接口。请联系开发商授权,详情请查阅 授权策略 |
4102 | 鉴权失败 | 请问的资源参数中,存在未被开发商授权授权访问的资源,请在 message 字段中查看无权查看的资源ID。 请联系开发商授权,详情请查阅 授权策略 |
4103 | 鉴权失败 | 子用户的 SecretID 不支持调用此接口,只有开发权有权调用 |