请问自定义域名的 HTTP 触发器的签名,怎么确定 CanonicalizedResource?[阿里云函数计算]

请问自定义域名的 HTTP 触发器的签名,怎么确定 CanonicalizedResource?

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
=====这是一个广告位,招租中,联系qq 78315851====
6 条回复 A 作者 M 管理员
  1. 可以按照我的步骤试一下:

    • 获取 HTTP 请求的 URI 路径:从 HTTP 请求中提取出 URI 路径部分,包括查询字符串。

    • 对 URI 进行 URL 编码:对 URI 路径进行 URL 编码,确保特殊字符被正确编码。

    • 获取 HTTP 请求中的参数:从 HTTP 请求中获取所有参数,并按参数名称进行字典排序。

    • 构建 CanonicalizedResource:按照特定格式构建 CanonicalizedResource 字符串,通常的格式为?<参数名称1>=<参数值1>&<参数名称2>=<参数值2>&…。

  2. 在使用自定义域名的HTTP触发器时,CanonicalizedResource的构造方法与使用默认域名的HTTP触发器是不一样的。以下是构造CanonicalizedResource的步骤:

    1. 将HTTP请求方法(例如:GET、POST)转换为大写字母并添加换行符

    GET

    1. 将HTTP请求的Content-MD5 Header的值添加换行符。如果Content-MD5 Header不存在,则在此处添加空行

    
    

    1. 将HTTP请求的Content-Type Header的值添加换行符。如果Content-Type Header不存在,则在此处添加空行

    
    

    1. 将HTTP请求的Date或者X-Fc-Date Header的值添加换行符。如果两个Header都存在,则使用X-Fc-Date Header

    Sun, 20 Dec 2020 09:40:16 GMT

    1. 将HTTP请求的CanonicalizedResource添加换行符。CanonicalizedResource的构造方法是:

    /{apiVersion}/proxy/{serviceName}/{functionName}/

    其中,{apiVersion}是API版本号(默认为2016-08-15),{serviceName}是函数计算服务名称,{functionName}是函数名称

    /2016-08-15/proxy/service-name/function-name/

    1. 将HTTP请求的CanonicalizedHeaders添加换行符。CanonicalizedHeaders的构造方法与使用默认域名的HTTP触发器一致,详见官方文档。

    2. 将上述步骤得到的字符串连接起来,即为CanonicalRequest

    GETSun, 20 Dec 2020 09:40:16 GMT/2016-08-15/proxy/service-name/function-name/host:example.comx-fc-account-id:1234567890123456x-fc-region:cn-hangzhoux-fc-security-token:security-tokenhost;x-fc-account-id;x-fc-region;x-fc-security-token2e1a6c0b6667c14138f1c8c2b6e3d4c2e7b7fba7c7b6c279f4e7aa5dc3a0a505

    1. 对CanonicalRequest进行签名,详见官方文档。
  3. 阿里云函数计算自定义域名的 HTTP 触发器签名中的 CanonicalizedResource 应该填写 HTTP 请求的路径部分,不包括域名部分。例如,假设您在控制台中配置了自定义域名 mydomain.com,并在函数计算中实现了签名验证逻辑。若您在 iOS 客户端中以 POST 方法访问 https://mydomain.com/api/functionName,则 CanonicalizedResource 应该填写 /api/functionName。签名示例代码如下:

    let path = "/api/functionName" // HTTP 请求的路径部分,不包括域名部分let method = "POST" // HTTP 请求的方法let headers = ["host": "mydomain.com"] // HTTP 请求的头部信息let queryString = "" // HTTP 请求的查询参数部分let signStr = "(method)(path)(queryString)" // 拼接签名字符串let signature = signWithKey(signStr, secret) // 使用密钥进行签名// 发送 HTTP 请求时将签名信息放入 HTTP 头部中,类似如下:let headers = [    "host": "mydomain.com",    "x-ca-key": "AccessKeyId",    "x-ca-signature-headers": "host",    "x-ca-signature": "(signature)"]

    其中,signWithKey 方法是使用密钥进行签名的自定义方法。在实际使用中,需要根据具体的签名算法和密钥生成逻辑进行实现。

  4. 在自定义域名的 HTTP 触发器中,签名验证的过程需要使用到 CanonicalizedResource 这个参数。CanonicalizedResource 是一个规范化资源描述符,用于标识要访问的资源,并且是签名验证中非常重要的一个参数。

    在确定 CanonicalizedResource 的值时,需要按照以下步骤进行计算:

    1. 首先,需要将请求方法(HTTP Verb)转换成大写字母并添加换行符“”。

    2. 接着,需要添加请求路径(URI),并确保其包含所有请求参数。如果请求不带参数,则请求路径就是 URI。否则,需要将请求参数和值附加在 URI 后面,并按请求参数名称进行排序。

    3. 然后,需要添加换行符“”和所有标准化请求头(CanonicalizedHeaders)。标准化请求头包括请求中所有带有 x-fc- 前缀的头部信息,并按字典序排列。如果请求中存在多个同名的标准化请求头,则需要将它们的值拼接在一起,以逗号分隔。

    4. 最后,需要添加换行符“”和所有标准化查询参数(CanonicalizedQueryParameters)。标准化查询参数包括请求中所有不带有 x-fc- 前缀的查询参数,并按字典序排列。如果请求中存在多个同名的标准化查询参数,则需要将它们的值拼接在一起,以逗号分隔。

    通过上述步骤计算得到的 CanonicalizedResource 就是签名验证中使用的参数。在进行签名验证时,需要将该参数与请求中的 Authorization 参数一起发送到函数计算服务,以确保请求的真实性和完整性。

    总之,在自定义域名的 HTTP 触发器中确定 CanonicalizedResource 的值需要按照上述步骤进行计算,并严格按照规范格式组装参数。这样可以确保签名验证的准确性和可靠性。

  5. 自定义域名的 HTTP 触发器,其 CanonicalizedResource 需要按照以下方式进行构造:

    1. 如果请求的路径为 /,则CanonicalizedResource为 //
    2. 如果请求路径不为 /,则CanonicalizedResource为 //{uri}。其中,{uri}为经过URI编码的请求路径和查询参数部分。
    3. 为function所在的Service名称,为调用的函数名称。

    举例说明,假设函数名称为myFunction,服务名称为myService,已经将域名绑定到HTTP触发器,自定义域名为:custom-domain.com。如果向该HTTP触发器发起GET请求,请求路径/test?a=1&b=2,则构造CanonicalizedResource的过程如下:

    1. 第一步的条件不满足,跳过这一步。
    2. 请求路径为/test?a=1&b=2,所以需将其进行URI编码并拼接到资源路径的末尾。得到的结果为/myService/myFunction/test%3Fa%3D1%26b%3D2

    因此,在进行签名时,CanonicalizedResource值应该是/myService/myFunction/test%3Fa%3D1%26b%3D2

  6. 当使用自定义域名的 HTTP 触发器时,签名验证需要确定一个名为 CanonicalizedResource 的字符串,该字符串是请求的实际内容。

    CanonicalizedResource 是一个经过 URL 编码和签名哈希处理后的字符串,它表示请求的实际资源路径。在 AWS Lambda 中,可以使用以下步骤来计算 CanonicalizedResource:

    1. 将原始请求 URL 进行编码。例如,如果请求 URL 是 [https://example.com/path/to/resource?a=1&b=2],则需要对其进行编码为 https://example.com/path/to/resource%3Fa%3D1%26b%3D2。

    2. 对编码后的请求 URL 进行签名哈希处理。这可以通过将请求 URL 和一个密钥(SecretAccessKey)组合在一起,然后对它们进行 SHA-256 哈希来实现。例如,如果 SecretAccessKey 是 “abcdefghijklmnopqrstuvwxyz1234567890”,则可以计算出以下哈希值:

    eJztBlLXNmVkZS9sbG9nZW5jc2lvbi4wYXcuYWRtaW4xMjM0NTY3ODkwNzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5