cvm.tencentcloudapi.com)をサポートしており、指定リージョンドメインアクセス(例:広州地域のドメインはcvm.ap-guangzhou.tencentcloudapi.com)もサポートしています。各リージョンのパラメータについては、共通パラメータのリージョンリストを参照してください。詳細は各製品の「リクエスト構造」ドキュメントで当該リージョンのサポート状況を確認してください。パラメータ名 | タイプ | 必須 | 説明 |
X-TC-Action | String | はい | 操作のAPI名。値はAPIドキュメントの入力パラメータの共通パラメータActionの説明を参照してください。例えばCVMのインスタンスリスト検索APIは、値がDescribeInstancesです。 |
X-TC-Region | String | - | リージョンパラメータは、操作対象となるデータのリージョンを識別するために使用されます。APIが受け入れる地域の値については、APIドキュメントの入力パラメータの共通パラメータRegionの説明を参照してください。注意:一部のAPIではこのパラメータの受け渡しが不要であり、APIドキュメントに特別な記載があります。その場合、パラメータを渡しても有効になりません。 |
X-TC-Timestamp | Integer | はい | 現在のUNIXタイムスタンプは、APIリクエストを開始した時間を記録できます。例:1529223702。注意:サーバー時間と5分以上の差がある場合、署名の期限切れエラーが発生します。 |
X-TC-Version | String | はい | 操作するAPIのバージョン。値はAPIドキュメントの入力パラメータの共通パラメータVersionの説明を参照してください。例えばCVMのバージョン2017-03-12です。 |
Authorization | String | はい | HTTP標準認証ヘッダーフィールド。例:TC3-HMAC-SHA256 Credential=AKIDEXAMPLE/Date/service/tc3_request, SignedHeaders=content-type;host, Signature=72e494ea8******************************************a96525168 ここで: TC3-HMAC-SHA256:署名方式であり、現在はこの値に固定されています。 Credential:署名の認証情報。AKIDEXAMPLEはSecretIdです。 DateはUTC標準時の日付であり、その値は共通パラメータX-TC-Timestampを変換したUTC標準時の日付と一致する必要があります。 serviceは製品名であり、通常はドメインのプレフィックスです。例えば、ドメイン cvm.tencentcloudapi.com は製品名が cvm であることを意味します。本製品の値は cvm です。 SignedHeaders:署名計算に参加するヘッダー情報であり、content-type と host は必須ヘッダーです。 Signature:署名ダイジェスト。計算プロセスの詳細は下記を参照してください。 |
X-TC-Token | String | いいえ | 一時的な証明書で使用されるTokenは、一時的なシークレットキーと組み合わせて使用する必要があります。一時的なシークレットシークレットキーとTokenは、CAMサービスでAPIを呼び出して取得する必要があります。長期シークレットキーにはTokenは不要です。 |
AKIDz8krbsJ5**********mLPx3EXAMPLE と Gu5t9xGAR***********EXAMPLE。ユーザーが広州リージョンのCVMで「未命名」という名前のホストステータスを確認したい場合、データを1件のみ返します。リクエストは次のようになります: curl -X POST https://cvm.tencentcloudapi.com \\-H "Authorization: TC3-HMAC-SHA256 Credential=AKIDz8krbsJ5**********mLPx3EXAMPLE/2019-02-25/cvm/tc3_request, SignedHeaders=content-type;host, Signature=72e494ea809ad7a8c8f7a4507b9bddcbaa8e581f516e8da2f66e2c5a96525168" \\-H "Content-Type: application/json; charset=utf-8" \\-H "Host: cvm.tencentcloudapi.com" \\-H "X-TC-Action: DescribeInstances" \\-H "X-TC-Timestamp: 1551113065" \\-H "X-TC-Version: 2017-03-12" \\-H "X-TC-Region: ap-guangzhou" \\-d '{"Limit": 1, "Filters": [{"Values": ["\\u672a\\u547d\\u540d"], "Name": "instance-name"}]}'

CanonicalRequest =HTTPRequestMethod + '\\n' +CanonicalURI + '\\n' +CanonicalQueryString + '\\n' +CanonicalHeaders + '\\n' +SignedHeaders + '\\n' +HashedRequestPayload
フィールド名称 | 説明 |
HTTPRequestMethod | HTTPリクエスト方法(GET、POST)。この例では、値は POSTです。 |
CanonicalURI | URIパラメータは、API 3.0ではスラッシュ(/)に固定されます。 |
CanonicalQueryString | HTTPリクエストURLのクエリ文字列です。POSTリクエストの場合、空文字列""に固定されます。GETリクエストの場合、URL内の疑問符(?)以降の文字列内容となります(例:Limit=10&Offset=0)。注意:CanonicalQueryStringはRFC3986を参照してURLEncodeを行う必要があり、文字セットはUTF8です。プログラミング言語の標準ライブラリを使用することを推奨し、すべての特殊文字をエンコードし、大文字形式とします。 |
CanonicalHeaders | 署名に使用するヘッダー情報は、少なくともhostとcontent-typeの2つのヘッダーを含める必要があります。また、カスタムヘッダーを追加して署名に参加させることで、リクエストの一意性と安全性を高めることができます。
連結ルール:ヘッダーのkeyとvalueはすべて小文字に変換し、先頭と末尾のスペースを削除した後、key:value\\n の形式で連結します。複数のヘッダーがある場合は、ヘッダーのkey(小文字)のASCIIコードの昇順で連結します。
この例での計算結果は content-type:application/json; charset=utf-8\\nhost:cvm.tencentcloudapi.com\\nです。
注意:content-typeは実際に送信するものと一致している必要があります。一部のプログラミング言語のネットワークライブラリは、指定されていない場合でも自動的にcharset値を追加することがあります。署名時と送信時でcontent-typeが一致しない場合、サーバーは署名検証失敗を返します。 |
SignedHeaders | 署名に参加するヘッダー情報であり、今回のリクエストでどのヘッダーが署名に参加したかを説明します。CanonicalHeadersに含まれるヘッダー内容と一対一対応します。content-typeとhostは必須ヘッダーです。
連結ルール:ヘッダーのkeyはすべて小文字に変換します。複数のヘッダーkey(小文字)はASCII昇順で連結し、セミコロン(;)で区切ります。この例では、content-type;hostとなります。 |
HashedRequestPayload | リクエスト本文(Requestpayload、すなわちbodyです。この例では {"Limit": 1, "Filters": [{"Values": ["\\u672a\\u547d\\u540d"], "Name": "instance-name"}]})のハッシュ値です。計算の擬似コードは Lowercase(HexEncode(Hash.SHA256(RequestPayload))) であり、HTTPリクエスト本文に対してSHA256ハッシュを適用し、16進数エンコードした後、エンコード文字列を小文字に変換します。GETリクエストの場合、RequestPayloadは空文字列に固定されます。この例の計算結果は35e9c5b0e3ae67532d3c9f17ead6c90222632e5b1ff7f6e89887f1398934f064です。 |
POST/content-type:application/json; charset=utf-8host:cvm.tencentcloudapi.comcontent-type;host35e9c5b0e3ae67532d3c9f17ead6c90222632e5b1ff7f6e89887f1398934f064
StringToSign =Algorithm + \\n +RequestTimestamp + \\n +CredentialScope + \\n +HashedCanonicalRequest
フィールド名称 | 説明 |
Algorithm | 署名アルゴリズムは、現在 TC3-HMAC-SHA256に固定されています。 |
RequestTimestamp | リクエストタイムスタンプは、リクエストヘッダーの共通パラメータX-TC-Timestampの値であり、現在時刻のUNIXタイムスタンプを秒単位で取得したものです。この例の値は 1551113065です。 |
CredentialScope | クレデンシャルスコープの形式は Date/service/tc3_request であり、日付、リクエスト対象サービス、終端文字列(tc3_request)を含みます。Date は UTC 標準時刻の日付であり、値は共通パラメータ X-TC-Timestamp から換算した UTC 標準時刻の日付と一致する必要があります。service は製品名であり、呼び出す製品のドメイン名と一致しなければなりません。この例の計算結果は2019-02-25/cvm/tc3_requestです。 |
HashedCanonicalRequest | 前述の手順で連結された正規リクエスト文字列のハッシュ値であり、計算の擬似コードは Lowercase(HexEncode(Hash.SHA256(CanonicalRequest))) です。この例の計算結果は 5ffe6a04c0664d6b969fab9a13bdab201d63ee709638e2749d62a09ca18d7031です。 |
TC3-HMAC-SHA25615511130652019-02-25/cvm/tc3_request5ffe6a04c0664d6b969fab9a13bdab201d63ee709638e2749d62a09ca18d7031
#include <tencentcloud/core/Sign.h>#include <tencentcloud/core/utils/Utils.h>using namespace TencentCloud;using namespace std;string Sign::Tc3Sign(const string &credDate, const string &serviceName, const string &signStr){string kKey = "TC3"+this->m_secretKey;string kDate = Utils::HmacSha256(kKey, credDate);string kService = Utils::HmacSha256(kDate, serviceName);string kSigning = Utils::HmacSha256(kService, "tc3_request");return Utils::HexEncode(Utils::HmacSha256(kSigning, signStr));}
SecretDate、SecretService および SecretSigning はバイナリデータであり、非印字文字を含む可能性があるため、ここでは中間結果を表示しません。フィールド名称 | 説明 |
m_secretKey | 元のSecretKey、すなわち Gu5t9xGAR***********EXAMPLEです。 |
credDate | すなわちCredentialのDateフィールドの情報です。この例の値は 2019-02-25です。 |
serviceName | すなわちCredentialのServiceフィールドの情報です。この例の値は cvmです。 |
signStr | 署名対象文字列 |
72e494ea8******************************************a96525168 です。Authorization =Algorithm + ' ' +'Credential=' + SecretId + '/' + CredentialScope + ', ' +'SignedHeaders=' + SignedHeaders + ', ' +'Signature=' + Signature
フィールド名称 | 説明 |
Algorithm | 署名方法は TC3-HMAC-SHA256に固定されています。 |
SecretId | キーペアのSecretId、すなわち AKIDz8krbsJ5**********mLPx3EXAMPLE。 |
CredentialScope | 上記参照、クレデンシャルスコープです。この例の計算結果は 2019-02-25/cvm/tc3_requestです。 |
SignedHeaders | 上記参照、署名に参加するヘッダー情報です。この例の値は content-type;hostです。 |
Signature | シグネチャ値。この例の計算結果は 72e494ea8******************************************a96525168です。 |
TC3-HMAC-SHA256 Credential=AKIDz8krbsJ5**********mLPx3EXAMPLE/2019-02-25/cvm/tc3_request, SignedHeaders=content-type;host, Signature=72e494ea8******************************************a96525168
POST https://cvm.tencentcloudapi.com/Authorization: TC3-HMAC-SHA256 Credential=AKIDz8krbsJ5**********mLPx3EXAMPLE/2019-02-25/cvm/tc3_request, SignedHeaders=content-type;host, Signature=72e494ea8******************************************a96525168Content-Type: application/json; charset=utf-8Host: cvm.tencentcloudapi.comX-TC-Action: DescribeInstancesX-TC-Version: 2017-03-12X-TC-Timestamp: 1551113065X-TC-Region: ap-guangzhou{"Limit": 1, "Filters": [{"Values": ["\\u672a\\u547d\\u540d"], "Name": "instance-name"}]}
#include <iostream>#include <iomanip>#include <sstream>#include <string>#include <stdio.h>#include <time.h>#include <openssl/sha.h>#include <openssl/hmac.h>using namespace std;string get_data(int64_t ×tamp){string utcDate;char buff[20] = {0};// time_t timenow;struct tm sttime;sttime = *gmtime(×tamp);strftime(buff, sizeof(buff), "%Y-%m-%d", &sttime);utcDate = string(buff);return utcDate;}string int2str(int64_t n){std::stringstream ss;ss << n;return ss.str();}string sha256Hex(const string &str){char buf[3];unsigned char hash[SHA256_DIGEST_LENGTH];SHA256_CTX sha256;SHA256_Init(&sha256);SHA256_Update(&sha256, str.c_str(), str.size());SHA256_Final(hash, &sha256);std::string NewString = "";for(int i = 0; i < SHA256_DIGEST_LENGTH; i++){snprintf(buf, sizeof(buf), "%02x", hash[i]);NewString = NewString + buf;}return NewString;}string HmacSha256(const string &key, const string &input){unsigned char hash[32];HMAC_CTX *h;#if OPENSSL_VERSION_NUMBER < 0x10100000LHMAC_CTX hmac;HMAC_CTX_init(&hmac);h = &hmac;#elseh = HMAC_CTX_new();#endifHMAC_Init_ex(h, &key[0], key.length(), EVP_sha256(), NULL);HMAC_Update(h, ( unsigned char* )&input[0], input.length());unsigned int len = 32;HMAC_Final(h, hash, &len);#if OPENSSL_VERSION_NUMBER < 0x10100000LHMAC_CTX_cleanup(h);#elseHMAC_CTX_free(h);#endifstd::stringstream ss;ss << std::setfill('0');for (int i = 0; i < len; i++){ss << hash[i];}return (ss.str());}string HexEncode(const string &input){static const char* const lut = "0123456789abcdef";size_t len = input.length();string output;output.reserve(2 * len);for (size_t i = 0; i < len; ++i){const unsigned char c = input[i];output.push_back(lut[c >> 4]);output.push_back(lut[c & 15]);}return output;}int main(){// シークレットキーパラメータstring SECRET_ID = "AKIDz8krbsJ5**********mLPx3EXAMPLE";string SECRET_KEY = "Gu5t9xGAR***********EXAMPLE";string service = "cvm";string host = "cvm.tencentcloudapi.com";string region = "ap-guangzhou";string action = "DescribeInstances";string version = "2017-03-12";int64_t timestamp = 1551113065;string date = get_data(timestamp);// ************* ステップ 1:正規リクエスト文字列の連結 *************string httpRequestMethod = "POST";string canonicalUri = "/";string canonicalQueryString = "";string canonicalHeaders = "content-type:application/json; charset=utf-8\\nhost:" + host + "\\n";string signedHeaders = "content-type;host";string payload = "{\\"Limit\\": 1, \\"Filters\\": [{\\"Values\\": [\\"\\\\u672a\\\\u547d\\\\u540d\\"], \\"Name\\": \\"instance-name\\"}]}";string hashedRequestPayload = sha256Hex(payload);string canonicalRequest = httpRequestMethod + "\\n" + canonicalUri + "\\n" + canonicalQueryString + "\\n"+ canonicalHeaders + "\\n" + signedHeaders + "\\n" + hashedRequestPayload;cout << canonicalRequest << endl;cout << "-----------------------" << endl;// ************* ステップ 2:署名対象文字列を連結する *************string algorithm = "TC3-HMAC-SHA256";string RequestTimestamp = int2str(timestamp);string credentialScope = date + "/" + service + "/" + "tc3_request";string hashedCanonicalRequest = sha256Hex(canonicalRequest);string stringToSign = algorithm + "\\n" + RequestTimestamp + "\\n" + credentialScope + "\\n" + hashedCanonicalRequest;cout << stringToSign << endl;cout << "-----------------------" << endl;// ************* ステップ 3:署名を計算する ***************string kKey = "TC3" + SECRET_KEY;string kDate = HmacSha256(kKey, date);string kService = HmacSha256(kDate, service);string kSigning = HmacSha256(kService, "tc3_request");string signature = HexEncode(HmacSha256(kSigning, stringToSign));cout << signature << endl;cout << "-----------------------" << endl;// ************* ステップ 4:Authorizationを連結する *************string authorization = algorithm + " " + "Credential=" + SECRET_ID + "/" + credentialScope + ", "+ "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature;cout << authorization << endl;cout << "------------------------" << endl;string headers = "curl -X POST https://" + host + "\\n"+ " -H \\"Authorization: " + authorization + "\\n"+ " -H \\"Content-Type: application/json; charset=utf-8\\"" + "\\n"+ " -H \\"Host: " + host + "\\n"+ " -H \\"X-TC-Action: " + action + "\\n"+ " -H \\"X-TC-Timestamp: " + RequestTimestamp + "\\n"+ " -H \\"X-TC-Version: " + version + "\\n"+ " -H \\"X-TC-Region: " + region + "\\n"+ " -d '" + payload;cout << headers << endl;return 0;};
エラーコード | エラー説明 |
AuthFailure.SignatureExpire | シグネチャの期限切れです。Timestampとサーバーがリクエストを受信した時間との差は5分を超えてはなりません。 |
AuthFailure.SecretIdNotFound | シークレットキーが存在しません。コンソールでシークレットキーが無効化されていないか、文字を少なくコピーしたか、あるいは多くコピーしたかを確認してください。 |
AuthFailure.SignatureFailure | シグネチャエラーです。シグネチャの計算エラー、またはシグネチャと実際に送信した内容が一致しない可能性があります。シークレットキー SecretKey のエラーによるものである可能性もあります。 |
AuthFailure.TokenFailure | 一時証明書Tokenエラーです。 |
AuthFailure.InvalidSecretId | シークレットキーが無効です(TencentCloud APIシークレットキータイプではありません)。 |
{"Response": {"TotalCount": 0,"InstanceStatusSet": [],"RequestId": "b5b41468-520d-4192-b42f-595cc34b6c1c"}}
Responseおよびその内部のRequestIdは固定のフィールドであり、リクエストが成功したかどうかに関わらず、APIが処理した限り、必ず返されます。RequestIdはAPIリクエストの唯一の識別子として使用されます。APIに異常が発生した場合は、該当 ID を添えて連絡してください。TotalCountとInstanceStatusSetはいずれもDescribeInstancesStatus APIで定義されたフィールドです。リクエストを呼び出したユーザーが現在CVMインスタンスを保有していないため、この状況ではTotalCountの戻り値は0となり、InstanceStatusSetリストは空です。{"Response": {"Error": {"Code": "AuthFailure.SignatureFailure","Message": "The provided credentials could not be validated. Please check your signature is correct."},"RequestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6"}}
Errorが出現するということは、そのリクエストの呼び出しが失敗したことを表します。Errorフィールドは、その内部のCodeおよびMessageフィールドとともに、呼び出しが失敗した場合には必ず返されます。Codeは具体的なエラーコードを示し、リクエストがエラーになった場合、まずこのコードを使用して共通エラーコードリストおよび該当APIスのエラーコードリストで原因と解決策を確認できます。Messageはこのエラーが発生した具体的な原因を表示しますが、業務の発展や体験の最適化に伴い、このテキストは頻繁に変更または更新される可能性があります。ユーザーはこの戻り値に依存すべきではありません。RequestIdはAPIリクエストの唯一の識別子として使用されます。APIに異常が発生した場合は、該当 ID を添えて連絡してください。エラーコード | エラー説明 |
AuthFailure.InvalidSecretId | キーが無効です(TencentCloud APIキータイプではありません)。 |
AuthFailure.MFAFailure | MFAエラーです。 |
AuthFailure.SecretIdNotFound | シークレットキーが存在しません。 |
AuthFailure.SignatureExpire | シグネチャの期限切れです。 |
AuthFailure.SignatureFailure | シグネチャエラーです。 |
AuthFailure.TokenFailure | tokenエラーです。 |
AuthFailure.UnauthorizedOperation | リクエストはCAM認可が取得されていません。 |
DryRunOperation | DryRunオペレーションは、リクエストが成功することを意味しますが、余分にDryRunパラメータが渡されただけです。 |
FailedOperation | 操作が失敗しました。 |
InternalError | 内部エラーです。 |
InvalidAction | APIが存在しません。 |
InvalidParameter | パラメータエラーです。 |
InvalidParameterValue | パラメータ値エラーです。 |
LimitExceeded | クォータ制限を超過しました。 |
MissingParameter | パラメータ不足エラーです。 |
NoSuchVersion | APIバージョンが存在しません。 |
RequestLimitExceeded | リクエスト回数がレート制限を超過しました。 |
ResourceInUse | リソースが使用中です。 |
ResourceInsufficient | リソース不足です。 |
ResourceNotFound | リソースが存在しません。 |
ResourceUnavailable | リソースは利用不可です。 |
UnauthorizedOperation | 操作は認可されていません。 |
UnknownParameter | 未知パラメータエラーです。 |
UnsupportedOperation | 操作はサポートされていません。 |
UnsupportedProtocol | HTTPSリクエスト方法が正しくありません。GETとPOSTリクエストのみサポートしています。 |
UnsupportedRegion | APIは指定されたリージョンをサポートしていません。 |
フィードバック