Erros comuns relacionados às informações de autenticação do IAM
Você pode encontrar os seguintes erros relacionados às informações de autenticação do 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": "******" }
Possível causa
O algoritmo de assinatura está incorreto e a assinatura calculada pelo cliente é diferente da calculada pelo APIG.
Solução
Método 1: ver logs.
- Obtenha o canonicalRequest calculado pelo APIG.
Obtenha request_id no corpo da mensagem de erro, pesquise error.log (você pode exibir esse arquivo no CLS) do nó shubao com base em request_id e obtenha canonicalRequest de error.log.
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"
- Obtenha o canonicalRequest calculado pelo cliente imprimindo logs ou usando interrupções de depuração. A tabela a seguir descreve as funções usadas para calcular o canonicalRequest nos SDKs de diferentes linguagens.
Tabela 1 Funções para calcular canonicalRequest nos SDKs de linguagens comuns Linguagem
Função
Java
Função Sign em com.cloud.sdk.auth.signer.DefaultSigner.class de libs/java-sdk-core-*.jar
C
Função sig_sign em signer.c
C++
Função Signer::createSignature em signer.cpp.
C#
Função Sign em signer.cs
Go
Função Sign em signer.go
JavaScript
Função Signer.prototype.Sign em signer.js
Python
Função Sign em signer.py
PHP
Função Sign em signer.php
Exemplo: canonicalRequest obtido em uma interrupção de depuração
POST /app1/ host:test.com x-sdk-date:20190126T033950Z host;x-sdk-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Verifique se o cannonicalRequest em 1 é o mesmo que em 2.
- Sim: verifique se AK e SK estão corretos, por exemplo, sem espaços.
- Não:
- Diferente na linha 1: o método de solicitação deve ser o mesmo.
- Diferente na linha 2: o caminho da solicitação deve ser o mesmo.
- Diferente na linha 3: os parâmetros de solicitação devem ser os mesmos.
- Diferente nas linhas 4 a 5: o cabeçalho da solicitação deve ser o mesmo em cada linha.
- Diferente na linha 7: o número de parâmetros de cabeçalho da solicitação deve ser o mesmo que o número de linhas de cabeçalho da solicitação.
- Diferente na linha 8: o corpo da solicitação deve ser o mesmo.
Tabela 2 canonicalRequest de APIG e um cliente Linha nº
Parâmetro
APIG
Cliente
1
Request method
GET
POST
2
Request path
/app1/
/app1/
3
Request parameters
Nenhum
Nenhum
4
Request header
host:test.com
host:test.com
5
Request header
x-sdk-date:20190126T033427Z
x-sdk-date:20190126T033950Z
6
Blank line
-
-
7
Request header parameters
host;x-sdk-date
host;x-sdk-date
8
Request body hash value
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Método 2: comparar a assinatura local com a obtida.
- Faça o download do SDK do JavaScript, visualize o SDK de assinatura visualizado e obtenha a assinatura.
- Descompacte o pacote e abra o arquivo demo.html usando um navegador.
- Obtenha o valor de x-sdk-date e verifique se a diferença entre esse valor e a hora atual está dentro de 15 minutos.
- Pressione F12 no teclado e escolha Sources > Snippets > New snippet.
- Copie o código a seguir para o snippet de script à direita, clique com o botão direito do mouse no nome do snippet à esquerda e selecione Run no menu de atalho. O valor exibido na guia Console é o valor de x-sdk-date.
function twoChar(s) { if (s >= 10) { return "" + s } else { return "0" + s } } function getTime() { var date = new Date(); return "" + date.getUTCFullYear() + twoChar(date.getUTCMonth() + 1) + twoChar(date.getUTCDate()) + "T" + twoChar(date.getUTCHours()) + twoChar(date.getUTCMinutes()) + twoChar(date.getUTCSeconds()) + "Z" } getTime()
- Adicione x-sdk-date aos Headers, defina outros parâmetros e clique em Debug para obter a assinatura.
Para todas as solicitações, exceto get, delete e head, adicione um corpo na área Body usando o mesmo formato de um corpo de solicitação real.
- Copie o comando curl na figura de 4, execute-o em uma interface de linha de comando e vá para a próxima etapa.
curl -X GET "http://192.168.0.1:10000/get" -H "X-Sdk-Date: 20221208T015751Z" -H "host: 192.168.0.1:10000" -H "Authorization: SDK-HMAC-SHA256 Access=6cc7e0042e1645c4bc954368d3b495a8, SignedHeaders=host;x-sdk-date, Signature=488409e25642fd03753a16238f89e35b466e93b3470160a9e894f53e79f2108a" -d $''
Se um autorizador personalizado for usado, substitua Authorization no comando curl pelo nome do autorizador.
- Compare a assinatura no código local com a assinatura visualizada de JavaScript.
Por exemplo, verifique se os valores de canonicalRequest, stringToSign e authorizationHeader no código de assinatura de Java são os mesmos que os da assinatura visualizada do JavaScript.
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": "******" }
Possíveis causas
- O cálculo da assinatura de AK/SK está incorreto. Resolva o problema referindo-se a Incorrect IAM authentication information: verify aksk signature fail.
- AK e SK não coincidem.
- A autenticação de AK/SK falha por mais de cinco vezes consecutivas e o par de AK/SK é bloqueado por cinco minutos. (As solicitações de autenticação são rejeitadas nesse período).
- Um token expirado é usado para autenticação de token.
Incorrect IAM authentication information: decrypt token fail
{ "error_msg": "Incorrect IAM authentication information: decrypt token fail", "error_code": "APIG.0301", "request_id": "******" }
Possível causa
O token não pode ser analisado para autenticação do IAM da API.
Solução
- Verifique se o token está correto.
- Verifique se o token foi obtido no ambiente onde a API é chamada.
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": "******" }
Possível causa
O AK usado para autenticação do IAM da API não existe.
Solução
Verifique se o AK está correto.