(一) CloudStack 生成 Signature 调用API (C#)

摘要:摘要: 使用 .NET/C# 框架实现对CloudStack 的API 操作

一:前言

撸主刚开始尝试使用CloudStack API时; 查阅相关资料,网上基本是官方的一个版本。大多都是复制内容;没有任何帮助。且撸主是在 .NET 的框架下操作;资料更少,目前经过学习摸索 系统基本处于稳定,故将前期遇到的问题整理一二,望能对大家有所帮助。

1 (98).jpg

/***************该段-官话********************/

CloudStack API 也是基于 Web Service,可以使用任何一种支持 HTTP 调用的语言(例如 Java,PHP)编写代码。

调用代码(caller)首先需要在管理服务器进行认证。目前 CloudStack 采用两种认证方式:

Session 认证:通过 login API,获得一个 JSESSIONID cookie 和一个 SESSIONKEY token。

API Key 认证。

/***************该段-官话********************/

 

二:撸主采用 API Key 进行认证:


1、生成Signature 之前,我们得先拥有[API Key] & [Security Key],该文主要记录Signature 加密实现,如何生成这两个Key 撸主 便不再赘述。

2、官方提供生成Signature 的语言是Perl:地址如下,可自行观摩:

https://github.com/snumano/CloudStack-API/blob/master/generate-url.pl

3、进而撸主又找到了 Python 版本:地址如下:

https://github.com/jasonhancock/cloudstack-pythonclient/blob/master/CloudStack/BaseClient.py

4、当然也少不了Java 版本的:CloudStack 开源包里应该能找到,在此撸主分享一篇帖文:

http://blog.csdn.net/rishengcsdn/article/details/38387721

 

三:使用C# 生成 Signature,有了以上资料,写起C# 版本的,自是得心应手,当然也有些许差异,几个问题需要注意:


1、[ApiKey] & [SecretKey] 字符串较长,切勿出错

2、参数加密时以小些形式

3、参数加密时,需要对其进行排序(以参数第一个字母为准)

4、加密前统一编码:UTF8

5、加密方式为:HmacSha1

6、加密后信息确认编码为: UTF8

7、组合字符串

 

四:代码实现(仅供参考,测试代码)

 

如:获取云主机的状态信息

参数信息:

调用地址:“http://*.*.*.*:**/client/api?”

API 名称: “listVirtualMachines”

参 数:

details=stats 状态

account=admin 操作人账号

id=**** 虚拟主机编号

API KEY:“******************”

SecretKey: “****************”

///<summary>生成CloudStackSignature可执行Url ///生成CloudStack可执行Url ///</summary> ///<returns></returns> publicstringGetSignatureApiUrl() { /*调用CloudStackAPI生成Signature并组合完整URL *1、根据配置获取参数 *2、有效性验证 *3、参数信息排序 *4、统一编码UTF-8 *5、使用HmacSha1编码加密 *6、加密后内容再次转UTF-8 *7、组合 */ varApiKey="*********************"; varSecretKey="******************"; //CloudStackAPI调用地址 varDeveloperServer="http://*.*.*.*:**/client/api?"; //ApiKey统一编码 Encodingenc=newUTF8Encoding(); stringencodedApiKey=HttpUtility.UrlEncode(ApiKey,enc); stringencodedSecreKey=HttpUtility.UrlEncode(SecretKey,enc); //参数,传递过来 List<string>Args=newList<string>(); Args.Add("command="+Command) Args.Add("details=stats"); Args.Add("account=admin"); Args.Add("id=****"); //有效性验证 //略 varoldparmsString=string.Join("&",Args); Args.Add("apikey="+ApiKey) //参数信息进行排序 Args=Args.OrderBy(o=>o).ToList(); //参数拼接 varparamsString=string.Join("&",Args); //对执行信息进行加密 stringsignature=newHashEncryptHelp().HmacSha1(encodedSecreKey,paramsString.Tolower()); //加密信息转UTF-8 stringencodedSignature=HttpUtility.UrlEncode(signature,enc); //组合URL字符 stringurl=DeveloperServer+oldparmsString+"&apikey="+encodedApiKey+"&signature="+encodedSignature; returnurl; }

 

 

输出:http://*.*.*.*:**/client/api?command=listVirtualMachines&details=stats&account=admin&id=****&apikey=****&signature=****

 

测试执行:成功.