更新时间:2023-12-13 GMT+08:00

IAM认证信息错误

IAM认证信息错误有:

Incorrect IAM authentication information: verify aksk signature fail

{    
  "error_msg": "Incorrect IAM authentication information: verify aksk signature fail, ......   
  "error_code": "APIG.0301", 
  "request_id": "******" 
}

可能原因

签名认证算法使用有问题,客户端计算的签名结果与API网关计算的签名结果不同。

解决方法

  1. 获取API网关计算的canonicalRequest。

    从报错信息的body中获取“request_id”,通过“request_id”查找shubao节点的error.log(error.log在CLS上查看),在error.log中获取canonicalRequest。
    2019/01/26 11:34:27 [error] 1211#0: *76 [lua] responses.lua:170: rewrite(): 473a4370fbaf69e42f9da243eb8f8c52;app-1;Incorrect IAM authentication information: verify signature fail;SDK-HMAC-SHA256 Access=071fe245-9cf6-4d75-822d-c29945a1e06a, SignedHeaders=host;x-sdk-date, Signature=b2ef2cddcef89cbfe22974c988909c1a94b1ac54114c30b8fe083d34a259e0f5;canonicalRequest:GET
    /app1/
    
    host:test.com
    x-sdk-date:20190126T033427Z
    
    host;x-sdk-date
    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, client: 192.168.0.1, server: shubao, request: "GET /app1 HTTP/1.1", host: "test.com"

  2. 通过打印日志或调试中断的方式得到客户端计算的canonicalRequest,每种语言SDK中计算canonicalRequest的位置如下:

    表1 常见语言SDK中计算canonicalRequest的位置

    语言

    位置

    java

    libs/java-sdk-core-..*.jar中com.cloud.sdk.auth.signer.DefaultSigner.class中的sign函数。

    c

    signer.c中的sig_sign函数。

    c++

    signer.cpp中的Signer::createSignature函数。

    c#

    signer.cs中的Sign函数。

    go

    signer.go中的Sign函数。

    JavaScript

    signer.js中的Signer.prototype.Sign函数。

    python

    signer.py中的Sign函数。

    php

    signer.php中的Sign函数。

    例如,在调试中断位置获取的canonicalRequest。

    POST 
    /app1/  
    
    host:test.com 
    x-sdk-date:20190126T033950Z  
    
    host;x-sdk-date 
    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

  3. 比较12中的cannonicalRequest是否一致。

    • 是,请检查appsecret或sk是否正确。(常见问题:appsecret或sk中多填了空格)
    • 否。
      • 第1行不同:请求方法要保持一致。
      • 第2行不同:请求路径要保持一致。
      • 第3行不同:请求参数要保持一致。
      • 第4-5行不同:请求头信息,每行都要保持一致。
      • 第7行不同:请求头参数名个数要和请求头信息行数保持一致。
      • 第8行不同:请求body要保持一致。
    表2 比较API网关和客户端计算的canonicalRequest

    行数

    参数

    API网关

    客户端

    1

    请求方法

    GET

    POST

    2

    请求路径

    /app1/

    /app1/

    3

    请求参数

    4

    请求头信息

    host:test.com

    host:test.com

    5

    请求头信息

    x-sdk-date:20190126T033427Z

    x-sdk-date:20190126T033950Z

    6

    空行

    -

    -

    7

    请求头参数名列表

    host;x-sdk-date

    host;x-sdk-date

    8

    请求body的hash值

    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Incorrect IAM authentication information: AK access failed to reach the limit,forbidden

{    
  "error_msg": "Incorrect IAM authentication information: AK access failed to reach the limit,forbidden." ......   
  "error_code": "APIG.0301", 
  "request_id": "******" 
}

可能原因

Incorrect IAM authentication information: decrypt token fail

{
  "error_msg": "Incorrect IAM authentication information: decrypt token fail",
  "error_code": "APIG.0301",
  "request_id": "******"
}

可能原因

用户的API所属IAM认证,TOKEN解析失败。

解决办法

  • 检查获取token的方法,token是否正确。
  • 检查获取token的环境与调用的环境是否一致。

Incorrect IAM authentication information: Get secretKey failed

{
"error_msg": "Incorrect IAM authentication information: Get secretKey failed,ak:******,err:ak not exist",
"error_code": "APIG.0301",
"request_id": "******"
}

可能原因

用户的API所属IAM认证,使用AK/SK签名方式访问,但是AK不存在。

解决方法

检查AK填写是否正确。