IAM认证信息错误
IAM认证信息错误有:
- Incorrect IAM authentication information: verify aksk signature fail
- Incorrect IAM authentication information: AK access failed to reach the limit,forbidden
- Incorrect IAM authentication information: decrypt token fail
- Incorrect IAM authentication information: Get secretKey failed
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网关计算的签名结果不同。
解决方法
- 获取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"
- 通过打印日志或调试中断的方式得到客户端计算的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
- 比较1和2中的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": "******" }
可能原因
- aksk签名计算错误。请参考Incorrect IAM authentication information: verify aksk signature fail解决方法。
- ak对应的sk不匹配。
- aksk频繁出现鉴权出错,连续错误5次以上,被锁定5分钟(5分钟内鉴权失败,误以为是异常的鉴权请求)。
- token鉴权时,token过期。