计算巢校验数字签名说明

本文介绍如何校验数字签名信息。

背景信息

在计算巢ECS内发起API调用时(如调用CheckoutLicensePushMeteringData等),计算巢会返回数字签名信息(即Token字段),服务商可以使用后文的方法计算数字签名信息的值,并将计算得到的数字签名信息和计算巢返回的数字签名信息进行对比,判断数据是否被篡改。

数字签名信息校验流程

校验流程

消息处理流程

此处以调用CheckoutLicense的返回值为例,计算数字签名的值。

  1. 调用CheckoutLicense,获取返回值。

    curl -H "Content-Type: application/json" -XPOST https://cn-wulanchabu.axt.aliyun.com/computeNest/license/check_out_license -d '{}'

    返回值

    {
        "code":200,
        "requestId":"4ea52d12-8e28-440b-b454-938d0518****",
        "instanceId":"i-0jl1ej1czubkimg6****",
        "result":{
            "RequestId":"CF54B4C9-E54C-1405-9A37-A0FE3D60****",
            "ServiceInstanceId":"si-85a343279cf341c2****",
            "LicenseMetadata":"{\"TemplateName\":\"Custom_Image_Ecs\",\"SpecificationName\":\"dataDiskSize\",\"CustomData\":\"30T\"}",
            "Token":"21292abff855ab5c2a03809e0e4fb048",
            "ExpireTime":"2022-11-10T08:03:16Z"
        }
    }
  2. 取出参数部分的字段,并将参数字段去掉数字签名(Token)信息后,按首字母进行排序并用&符号进行拼接。

    拼接后的字符串如下:

    ExpireTime=2022-11-02T02:39:43Z&LicenseMetadata={"TemplateName":"Custom_Image_Ecs","SpecificationName":"dataDiskSize","CustomData":"30T"}&RequestId=CF54B4C9-E54C-1405-9A37-A0FE3D60xxxx&ServiceInstanceId=si-85a343279cf341c2xxxx
    说明

    对于存在LicenseMetadata(许可证元数据)的服务。请注意以下内容,否则在加签处理中会出现错误,导致签名不一致。

    • 模板中的参数不要出现中文(例如套餐名、模板名称)。

    • 使用时将返回的JSON转译为{"TemplateName":"Custom_Image_Ecs","SpecificationName":"dataDiskSize","CustomData":"30T"}

  3. 在排序后的字符串最后加上该服务的密钥。

    服务密钥的字符串格式为:Key={ServiceProviderKey}。您可在服务详情页,获取服务密钥。获取服务密钥

    加上服务密钥后的字符串如下:

    ExpireTime=2022-11-02T02:39:43Z&LicenseMetadata={"TemplateName":"Custom_Image_Ecs","SpecificationName":"dataDiskSize","CustomData":"30T"}&RequestId=CF54B4C9-E54C-1405-9A37-A0FE3D60xxxx&ServiceInstanceId=si-85a343279cf341c2xxxx&Key=37131c4a485141xxxxxx
  4. 使用MD5加密算法对处理后的字符串进行加密,加密后得到的为32位小写的值。

    加密完成后,得到的值为:21292abff855ab5c2a03809e0e4fb048。

    服务商通过上述方法计算得到的Token值,与计算巢返回的Token值进行对比。若两个值相同,则表示数据未被篡改。